database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41277 게시물 읽기
No. 41277
질문 다시 올립니다.
작성자
최종욱(opop8306)
작성일
2016-11-04 14:07
조회수
6,361

죄송합니다. 어제 문의 글을 올렸서 감사하게도 답변을 달아주셨는데요.

 

질문을 잘못 올렸네요. ㅠㅠ

 

다시 한번 올립니다.

아래와 같이 소스테이블에 코드별 값이 들어있습니다.

매월 코드에 따른 값이 있는것은 아니구요. 랜덤하게 들어있는데요.

이것을 강제로 년월을 넣어 최근 값을 가져오게 하는 쿼리를 구사하고자 합니다.

아래를 보시면 예를들어 2004.08월에 값이 7658이 들어왔고 그다음 최근 값이 2005.01이기때문에

2004.08~2004.12까지는 2004.08의 값이 2005.01월에 새로운 값인 7657이 들어왔기 때문에 2005.01부터 새로운 값이 들어올때까진

7657이 찍히도록 쿼리를 구사해야 합니다. ㅠㅠ

 

여러가지로 해봤는데요.. 당췌.. 모르겠네요 고수님들 도와 주세요

 

 

데이터.(소스)

년월 코드1 코드2 값

200501 A1FRFEMSM XXX 7657

200408 A1FRFEMSM XXX 7658

200402 A1FRFEMSM XXX 7657

 

원하는값.

년월 코드1 코드2 값

200501 A1FRFEMSM XXX 7657

200412 A1FRFEMSM XXX 7658

200411 A1FRFEMSM XXX 7658

200410 A1FRFEMSM XXX 7658

200409 A1FRFEMSM XXX 7658

200408 A1FRFEMSM XXX 7658

200407 A1FRFEMSM XXX 7657

200406 A1FRFEMSM XXX 7657

200405 A1FRFEMSM XXX 7657

200404 A1FRFEMSM XXX 7657

200403 A1FRFEMSM XXX 7657

200402 A1FRFEMSM XXX 7657

 

이 글에 대한 댓글이 총 5건 있습니다.

WITH t AS
(
SELECT '200501' ym, 'A1FRFEMSM' cd1, 'XXX' cd2, 7657 v FROM dual
UNION ALL SELECT '200408', 'A1FRFEMSM', 'XXX', 7658 FROM dual
UNION ALL SELECT '200402', 'A1FRFEMSM', 'XXX', 7657 FROM dual
)
SELECT cd1, cd2
     , TO_CHAR(ADD_MONTHS(sym, lv-1), 'yyyymm') ym
     , v
  FROM (SELECT cd1, cd2, v
             , TO_DATE(ym, 'yyyymm') sym
             , LEAD(TO_DATE(ym, 'yyyymm')) OVER(
               PARTITION BY cd1, cd2 ORDER BY ym) eym
          FROM t
        )
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
 WHERE lv <= NVL(MONTHS_BETWEEN(eym, sym), 1)
 ORDER BY cd1, cd2, ym DESC
;

마농(manon94)님이 2016-11-04 14:27에 작성한 댓글입니다.

마농님 항상 감사합니다.

 

그런데요. 일별로 코드가 1개가 아니라 코드는 다수입니다.

 

WITH t AS

(

SELECT '200501' ym, 'A1FRFEMSM' cd1, 'XXX' cd2, 7657 v FROM dual

UNION ALL SELECT '200408', 'A1FRFEMSM', 'XXX', 7658 FROM dual

UNION ALL SELECT '200402', 'A1FRFEMSM', 'XXX', 7657 FROM dual

UNION ALL SELECT '200402', 'A1FRFEMSA', 'XXX', 1111 FROM dual

UNION ALL SELECT '200403', 'A1FRFEMSA', 'XXX', 1112 FROM dual

UNION ALL SELECT '200404', 'A1FRFEMSA', 'XXX', 1112 FROM dual

)SELECT cd1, cd2

, TO_CHAR(ADD_MONTHS(sym, lv-1), 'yyyymm') ym

, v

FROM (SELECT cd1, cd2, v

, TO_DATE(ym, 'yyyymm') sym

, LEAD(TO_DATE(ym, 'yyyymm')) OVER(

PARTITION BY cd1, cd2 ORDER BY ym) eym

FROM t

)

, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)

WHERE lv <= NVL(MONTHS_BETWEEN(eym, sym), 1)

ORDER BY cd1, cd2, ym DESC

 

 

이렇게 했을때 각코드별로 일자를 만들어야 하는데요.. 잘 되지가 않네요..ㅠㅠ

최종욱(opop8306)님이 2016-11-04 17:13에 작성한 댓글입니다.

원하시는 결과표를 올려주세요.

약간의 설명을 곁들이시면 더 좋구요.

마농(manon94)님이 2016-11-07 09:42에 작성한 댓글입니다.

아래와 같이 코드가 1개 이상일때

각 코드별로 일자별 데이터를 만드는데요.

새로운 값이 들어오기전까진 최근 일자의 CD1,CD2,V값을 가져오면 됩니다.

마농님이 첫번째로 주신 쿼리를 응용해서 해보았는대요 아래 쿼리를 실행하면

각 코드별 최근 일자까지만 데이터가 나옵니다.

'A1FRFEMSM' 코드는 200501 'A1FRFEMSA' 코드는 200409

전 현재까지 데이터가 존재해야 하거든요..

TO_CHAR(SYSDATE,'YYYYMM')-1 이렇게 금일 실행시 201610까지 데이터가 만들어져야합니다.

 

 

 

SQL

WITH t AS

(

SELECT '200501' ym, 'A1FRFEMSM' cd1, 'XXX' cd2, 7657 v FROM dual

UNION ALL SELECT '200408', 'A1FRFEMSM', 'XXX', 7658 FROM dual

UNION ALL SELECT '200402', 'A1FRFEMSM', 'XXX', 7657 FROM dual

UNION ALL SELECT '200402', 'A1FRFEMSA', 'XXX', 1111 FROM dual

UNION ALL SELECT '200405', 'A1FRFEMSA', 'XXX', 1112 FROM dual

UNION ALL SELECT '200409', 'A1FRFEMSA', 'XXX', 1112 FROM dual

)SELECT cd1, cd2

, TO_CHAR(ADD_MONTHS(sym, lv-1), 'yyyymm') ym

, v

FROM (SELECT cd1, cd2, v

, TO_DATE(ym, 'yyyymm') sym

, LEAD(TO_DATE(ym, 'yyyymm')) OVER(

PARTITION BY cd1, cd2 ORDER BY ym) eym

FROM t

)

, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)

WHERE lv <= NVL(MONTHS_BETWEEN(eym, sym), 1)

ORDER BY cd1, cd2, ym DESC

 

 

결과

CD1 CD2 YM V

A1FRFEMSA XXX 200404 1112

A1FRFEMSA XXX 200403 1112

A1FRFEMSA XXX 200402 1111

A1FRFEMSM XXX 200501 7657

A1FRFEMSM XXX 200412 7658

A1FRFEMSM XXX 200411 7658

A1FRFEMSM XXX 200410 7658

A1FRFEMSM XXX 200409 7658

A1FRFEMSM XXX 200408 7658

A1FRFEMSM XXX 200407 7657

A1FRFEMSM XXX 200406 7657

A1FRFEMSM XXX 200405 7657

A1FRFEMSM XXX 200404 7657

A1FRFEMSM XXX 200403 7657

A1FRFEMSM XXX 200402 7657

A1FRFEMSA XXX 200412 1112

A1FRFEMSA XXX 200411 1112

A1FRFEMSA XXX 200410 1112

A1FRFEMSA XXX 200409 1112

A1FRFEMSA XXX 200408 1112

A1FRFEMSA XXX 200407 1112

A1FRFEMSA XXX 200406 1112

A1FRFEMSA XXX 200405 1112

A1FRFEMSA XXX 200404 1111

A1FRFEMSA XXX 200403 1111

A1FRFEMSA XXX 200402 1111

 

최종욱(opop8306)님이 2016-11-07 10:58에 작성한 댓글입니다.

SELECT cd1, cd2
     , TO_CHAR(ADD_MONTHS(sym, lv-1), 'yyyymm') ym
     , v
  FROM (SELECT cd1, cd2, v
             , TO_DATE(ym, 'yyyymm') sym
             , LEAD(TO_DATE(ym, 'yyyymm'), 1, TRUNC(sysdate, 'mm'))
               OVER(PARTITION BY cd1, cd2 ORDER BY ym) eym
          FROM t
        )
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 999)
 WHERE lv <= NVL(MONTHS_BETWEEN(eym, sym), 1)
 ORDER BY cd1, cd2, ym DESC
;

마농(manon94)님이 2016-11-07 12:58에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41280마농님 도와주세요 프로시져에서 막히네요 ㅠㅠ loop관련 도움 주세요 ㅠㅠ [1]
최종욱
2016-11-09
6094
41279마이그래이션(?)관련 질문입니다.
서범석
2016-11-08
5677
41278start with 구문 Update 사용 문의 [8]
박재덕
2016-11-08
7468
41277질문 다시 올립니다. [5]
최종욱
2016-11-04
6361
41276정렬 관련 문의 [1]
또하루
2016-11-03
6034
41275누적 쿼리. [2]
최종욱
2016-11-03
6391
41274증감율 구하기 질문 드립니다. [2]
량디
2016-11-02
6578
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.052초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다