임의의 테이블(TBL이라 칭하겠습니다)이 있습니다.
TBL 테이블엔 날짜, 이름, 소수점 포함 금액이 있습니다.
4월1일 ~ 4월 30일까지 조회를 하려 합니다. (데이터는 일별로 모두 존재합니다)
헌데 별도의 테이블(CON_TBL이라 칭하겠습니다.)에 임의의 날짜가 입력되어있습니다.
예를들어 4월 10일, 4월 20일 두 개의 날짜가 등록되어있습니다. 월 별 등록될 수 있는 일자는
랜덤이며 갯수 또한 랜덤으로 등록 가능합니다.
4월자 TBL 테이블을 SELECT 하는데 CON_TBL에 등록되어 있는 날짜에 영향을 끼쳐 아래와 같이
SUM이 되어야 합니다. (금액을 제외한 나머지 컬럼은 GROUP BY절에 포함되어야 합니다.)
CON_TBL 테이블에 4월 10일, 4월 20일 두 개의 날짜가 등록되어있다면 TBL테이블에 등록되어있는,
4월 1일 ~ 4월 9일자의 합
4월 10일 ~ 4월 19일자의 합
나머지 4월 20일 ~ 4월 30일자의 합
이렇게 세 그룹의 날짜별 합계가 나와야 합니다.
이렇게 나와야 하는 이유는 금액별 소수점이 적용되어야 하는 기준 때문입니다.
어떻게 하면 좋을까요;;
DB는 오라클10g 입니다.
WITH tbl AS ( SELECT '20190401' dt, 10 amt FROM dual UNION ALL SELECT '20190409', 20 FROM dual UNION ALL SELECT '20190410', 30 FROM dual UNION ALL SELECT '20190419', 40 FROM dual UNION ALL SELECT '20190420', 50 FROM dual UNION ALL SELECT '20190430', 60 FROM dual ) , con_tbl AS ( SELECT '20190410' dt FROM dual UNION ALL SELECT '20190420' FROM dual ) SELECT a.sdt , a.edt , ROUND(AVG(b.amt), 2) amt FROM (SELECT TO_CHAR(dt, 'yyyymmdd') sdt , TO_CHAR(LEAD(dt - 1, 1, LAST_DAY(dt)) OVER(ORDER BY dt), 'yyyymmdd') edt FROM (SELECT TO_DATE('201904', 'yyyymm') dt FROM dual UNION ALL SELECT TO_DATE(dt, 'yyyymmdd') dt FROM con_tbl WHERE dt LIKE '201904'||'%' ) ) a , (SELECT dt, amt FROM tbl WHERE dt LIKE '201904'||'%' ) b WHERE b.dt BETWEEN a.sdt AND a.edt GROUP BY a.sdt, a.edt ORDER BY a.sdt ;