기간 검색 질문입니다. 0 4 2,019

by 장형근 [SQL Query] 기간 검색 [2013.08.22 17:42:49]




아래와 같은 테이블이 있습니다.


CREATE TABLE TEST

(ID NUMBER, ST_DATE VARCHAR2(8), ED_DATE VARCHAR2(8), AMT NUMBER, RT NUMBER);


INSERT INTO TEST VALUES(1, 20120901, 20130531, 625000, 25);

INSERT INTO TEST VALUES(2, 20130401, 20130831, 550000, 20);

INSERT INTO TEST VALUES(3, 20130501, 20130430, 500000, 15);

 

데이타가 이렇게 있을 때

 

20120901 ~ 20130331, 625000, 25

20130401 ~ 20130430, 625000 + 550000, 25 + 20

20130501 ~ 20130531, 625000 + 550000 + 500000, 25 + 20 + 15

20130601 ~ 20130831, 550000 + 500000, 20 + 15

20130901 ~ 20140430, 500000, 15

이렇게 5개의 로우가 나왔으면 합니다.

 

기간이 중복된 데이타들일 경우 잘라서 SUM 한 값들이 나오면 되는데 625000 + 550000 는 1175000으로 표현되면 됩니다.

ID 1번 2번 값을 보여준다는 의미로 저렇게 썼습니다.

방법이 뭘까요?

by 아발란체 [2013.08.22 18:01:17]

20120901 ~ 20130331, 625000, 25

20130401 ~ 20130430, 625000 + 550000, 25 + 20

20130501 ~ 20130531, 625000 + 550000 + 500000, 25 + 20 + 15

20130601 ~ 20130831, 550000 + 500000, 20 + 15

20130901 ~ 20140430, 500000, 15

빨간색 날짜 부분이 어떤 기준으로 산출된 것인지 이해가 잘 안되네요,
설명을 좀 더 해주셨으면 좋겠습니다.


by 뭉치 [2013.08.28 15:17:02]

개인적으로 자주 못 들어와 이제사 질문을 봤습니다.

밑에 답변 보고 벌써 파악 되셨을 듯 싶네요.

늦어서 죄송합니다.


by 마농 [2013.08.22 18:44:29]
WITH test AS
(
SELECT 1 id, '20120901' sdt, '20130531' edt, 625000 amt, 25 rt FROM dual
UNION ALL SELECT 2, '20130401', '20130831', 550000, 20 FROM dual
UNION ALL SELECT 3, '20130501', '20140430', 500000, 15 FROM dual
--UNION ALL SELECT 4, '20150101', '20151231', 100000, 10 FROM dual
)
-- 동일일자 겹치는 경우 오류 보완 위해 Group By 추가
SELECT TO_CHAR(sdt, 'yyyymmdd') sdt
     , TO_CHAR(edt, 'yyyymmdd') edt
     , amt
     , rt
  FROM (SELECT sdt
             , LEAD(sdt - 1) OVER(ORDER BY sdt) edt
             , SUM(SUM(amt)) OVER(ORDER BY sdt) amt
             , SUM(SUM(rt )) OVER(ORDER BY sdt) rt
          FROM (SELECT id
                     , DECODE(lv, 1, TO_DATE(sdt, 'yyyymmdd')
                                   , TO_DATE(edt, 'yyyymmdd') + 1) sdt
                     , DECODE(lv, 1, amt, -amt) amt
                     , DECODE(lv, 1, rt , -rt ) rt
                  FROM test
                     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2)
                )
         GROUP BY sdt
        )
 WHERE amt != 0
;

by 마농 [2013.08.23 08:21:22]
어제 올린 댓글에 오류가 있어 보완했습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입