아래와 같은 데이타를 가지고 쿼리를 만들고 싶습니다.
아래와 같이 기간이 쪼개져 있는 경우 20140101~20140131 기간동안의 RATE의 합을 구하고 싶습니다.
다만, 데이타가 아래와 같이 기간 FULL이 아닌 쪼개져 있는 날짜들이 있을 경웨는 합이 되어야 합니다.
고수님들~~ 도움 부탁드립니다.
WITH TMP AS
(
SELECT '20140101' AS SDATE, '20140115' AS EDATE, 40 AS RATE FROM DUAL UNION ALL
SELECT '20140101', '20140131', 20 FROM DUAL UNION ALL
SELECT '20140116', '20140131', 30 FROM DUAL
)
SELECT * FROM TMP;
SDATE | EDATE | RATE |
20140101 | 20140115 | 40 |
20140101 | 20140131 | 20 |
20140116 | 20140131 | 30 |
결과
SDATE | EDATE | RATE |
20140101 | 20140115 | 60 |
20140116 | 20140131 | 50 |
마농님이 마소에 연재하신 글 중에 해당하는 내용이 있네요.
http://www.dbguide.net/knowledge.db?cmd=view&boardUid=175580&boardConfigUid=20&categoryUid=206
WITH tmp AS ( SELECT '20140101' sdate, '20140115' edate, 40 rate FROM dual UNION ALL SELECT '20140101', '20140131', 20 FROM dual UNION ALL SELECT '20140116', '20140131', 30 FROM dual ) SELECT TO_CHAR(sdt, 'yyyymmdd') sdate , TO_CHAR(edt, 'yyyymmdd') edate , rate FROM (SELECT dt sdt , LEAD(dt - 1) OVER(ORDER BY dt) edt , SUM(SUM(rate)) OVER(ORDER BY dt) rate FROM (SELECT DECODE(lv, 1, rate, -rate) rate , DECODE(lv, 1, TO_DATE(GREATEST(sdate, sdt), 'yyyymmdd') , TO_DATE( LEAST(edate, edt), 'yyyymmdd') + 1 ) dt FROM tmp , (SELECT '20140101' sdt, '20140131' edt FROM dual) , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2) WHERE sdate <= edt AND edate >= sdt ) GROUP BY dt ) WHERE rate > 0 ;