아래와 같은 테이블이 있습니다.
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
;