별도 등록된 날짜별로 sum을 쳐야 하는데 방법을 모르겠습니다. 0 2 1,200

by 느훼훼 [2019.05.07 17:20:44]


임의의 테이블(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 입니다.

by 마농 [2019.05.08 08:50:21]
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
;

 


by 느훼훼 [2019.05.08 09:03:45]

TO_CHAR(LEAD(dt - 1, 1, LAST_DAY(dt)) OVER(ORDER BY dt), 'yyyymmdd')

이 구분이 핵심이네요. 방법을 알았으니 위 구문을 이용 해 열심히 짜보겠습니다.

답변감사합니다. (_ _)

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