아래와 같은 테이블이 있습니다.
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번 값을 보여준다는 의미로 저렇게 썼습니다.
방법이 뭘까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 ; |