안녕하세요.
아무리 고민을 해도 답이 나오지 않아서 문의 드립니다.
1. 날짜는 한달단위로 표시가 됩니다.
--> 해당월의 1일부터 마지일까지 출력하는 부분은 완성했습니다.
2. 현재 데이터는 시작일, 종료일로 입력되어 있습니다.
3. 날짜(1달 단위)에 시작일, 종료일이 포함된 데이터 건수를 가져와야 합니다.
현재 등록되어 있는 데이터는 아래와 같습니다.
번호 시작일 종료일
1 2021.03.02 2021.03.04
2 2021.03.04 2021.03.05
3. 2021.03.05 2021.03.06
데이터가 위와 같이 입력되어 있을경우 출력데이터가 해당월 전체일자(1달 단위)가 출력되고 시작일, 종료일에 포함된 날짜에 카운트를 구해야 합니다.
기준일자 카운트
2021.03.01 0
2021.03.02 1
2021.03.03 1
2021.03.04 2
2021.03.05 2
2021.03.06 1
2021.03.07 0
2021.03.08 0
......
*기준일자에 시작일 종료일이 포함된 데이터 건수를 가져와야 하는데 아무리 고민을 해도 어떻게 할수 있을지 모르겠습니다.
도움 부탁드립니다..
달력테이블과 조인하는 방법을 참고해봤습니다.
http://www.gurubee.net/article/55635
http://www.gurubee.net/article/67721
WITH CALENDAR_DATES AS ( SELECT DATE'2021-02-28' + LEVEL CALENDAR_DATE FROM DUAL CONNECT BY LEVEL <= 10 ), TMP AS ( SELECT SDT + (LV - 1) DT FROM (SELECT 1 NUM, TO_DATE('2021.03.02','YYYY.MM.DD') SDT, TO_DATE('2021.03.04','YYYY.MM.DD') EDT FROM DUAL UNION ALL SELECT 2, TO_DATE('2021.03.04','YYYY.MM.DD'), TO_DATE('2021.03.05','YYYY.MM.DD') FROM DUAL UNION ALL SELECT 3, TO_DATE('2021.03.05','YYYY.MM.DD'), TO_DATE('2021.03.06','YYYY.MM.DD') FROM DUAL) , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 10) WHERE LV <= EDT + 1 - SDT ORDER BY DT ) SELECT CALENDAR_DATE, COUNT(T.DT) FROM CALENDAR_DATES LEFT JOIN TMP T ON T.DT = CALENDAR_DATE GROUP BY CALENDAR_DATE ORDER BY CALENDAR_DATE
pajama님 쿼리 참고해서 약간 심플버전(?) 입니다.
WITH dataTbl AS ( SELECT 1 AS nums, TO_DATE('2021.03.02','YYYY.MM.DD') AS sdate , TO_DATE('2021.03.04','YYYY.MM.DD') AS edate FROM dual UNION ALL SELECT 2 AS nums, TO_DATE('2021.03.04','YYYY.MM.DD') AS sdate , TO_DATE('2021.03.05','YYYY.MM.DD') AS edate FROM dual UNION ALL SELECT 3 AS nums, TO_DATE('2021.03.05','YYYY.MM.DD') AS sdate , TO_DATE('2021.03.06','YYYY.MM.DD') AS edate FROM dual ) ,CALENDAR_DATES AS ( SELECT TO_DATE('2021-02-28','YYYY.MM.DD') + LEVEL CALENDAR_DATE FROM DUAL CONNECT BY LEVEL <= 8 ) SELECT A.CALENDAR_DATE AS check_date, COUNT(nums) AS date_cnt -- , MIN(B.sdate), MAX(B.edate) FROM CALENDAR_DATES A LEFT OUTER JOIN dataTbl B ON A.CALENDAR_DATE BETWEEN B.sdate AND B.edate GROUP BY A.CALENDAR_DATE ORDER BY A.CALENDAR_DATE
WITH t AS ( SELECT 1 no, '2021.03.02' sdt, '2021.03.04' edt FROM dual UNION ALL SELECT 2, '2021.03.04', '2021.03.05' FROM dual UNION ALL SELECT 3, '2021.03.05', '2021.03.06' FROM dual ) , calendar AS ( SELECT TO_CHAR(dt + LEVEL - 1, 'yyyy.mm.dd') dt FROM (SELECT TO_DATE('202103', 'yyyymm') dt FROM dual) -- 기준년월 CONNECT BY LEVEL <= LAST_DAY(dt) - dt + 1 ) SELECT a.dt , COUNT(b.sdt) cnt FROM calendar a LEFT OUTER JOIN t b ON a.dt BETWEEN b.sdt AND b.edt GROUP BY a.dt ORDER BY a.dt ;