작성일자 : 2023-10-27
Ver 0.1.1
0.Intro
Oracle 에서 쿼리문을 작성하다 보면 테이블에 저장되지 않는 날짜까지 포함해서 조회해야 할 경우가 있다. 또는 Oracle을 데이터 원본으로 Tableau 대시보드를 만들때, Master Date가 필요한 경우도 있다. 이럴 때는 시작일자와 종료일자를 설정하여 날짜 뷰를 생성하여 OUTER JOIN을 통해 해결할 수 있다.
1. 날짜 View 만들기
SELECT TO_DATE('2023-10-23','YYYY-MM-DD') + LEVEL - 1 AS dates --시작일자
FROM dual
CONNECT BY LEVEL <= (TO_DATE('2023-10-27','YYYY-MM-DD') - TO_DATE('2023-10-20','YYYY-MM-DD')+1)
-- CONNECT BY LEVEL <= 종료일자 - 시작일자 + 1
2. Mater Date에 데이터 표시
2023-10-20 ~ 2023-10-27 까지 날짜가 들어있는 뷰(View)를 동적으로 생성할 수 있다.
해당 날짜 View (Master Date View)와 데이터 테이블을 LEFT OUTER 을 하면 테이블에 존재하지 않는 날짜까지 포함해서 조회할 수 있다.
WITH date_range AS
(
SELECT TO_DATE('2023-10-20','YYYY-MM-DD') + LEVEL-1 dates
FROM dual
CONNECT BY LEVEL <= (TO_DATE('2023-10-27','YYYY-MM-DD') - TO_DATE('2023-10-20','YYYY-MM-DD') + 1)
)
,matchday AS
(
SELECT TO_DATE('2023-10-20', 'YYYY-MM-DD') AS MatchDay
,'MatchDay' AS IS_MatchDay FROM dual
UNION
ALL
SELECT TO_DATE('2023-10-23', 'YYYY-MM-DD') AS MatchDay
,'MatchDay' AS IS_MatchDay FROM dual
UNION
ALL
SELECT TO_DATE('2023-10-27', 'YYYY-MM-DD') AS MatchDay
,'MatchDay' AS IS_MatchDay FROM dual
)
SELECT a.dates
, b.IS_MatchDay
FROM date_range a
LEFT
OUTER
JOIN matchday b
ON a.dates = b.MatchDay
ORDER BY a.dates;
/* WHERE JOIN
SELECT a.dates
, b.IS_MatchDay
FROM date_range a
, matchday b
WHERE a.dates = b.MatchDay(+)
ORDER BY a.dates;
*/
참고 사이트 : https://gent.tistory.com/11