아래와 같은 테이블이 있습니다.
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번 값을 보여준다는 의미로 저렇게 썼습니다.
방법이 뭘까요?
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 ;