기간 관련 쿼리 문의 0 2 908

by 너구리~ [2014.08.22 20:35:44]


아래와 같은 데이타를 가지고 쿼리를 만들고 싶습니다.

아래와 같이 기간이 쪼개져 있는 경우 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

 

by madcat [2014.08.24 16:29:52]

마농님이 마소에 연재하신 글 중에 해당하는 내용이 있네요.

http://www.dbguide.net/knowledge.db?cmd=view&boardUid=175580&boardConfigUid=20&categoryUid=206


by 마농 [2014.08.25 08:39:05]
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
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입