통계나 정산 쿼리를 짜다보면 날짜별 정산 내역을 조회할 경우가 있는데

 

중간에 비는 날짜가 생기는 경우 해당 날짜의 ROW가 없는 경우가 있는데

 

이럴때 'Connect By'를 이용해 날짜 레코드를 만들어서 OUTER JOIN을 걸어

 

사용하면 좋다.

 

 

날짜 레코드 만들기

SELECT TO_CHAR(TO_DATE('{시작일자}', 'YYYYMMDD')+LEVEL-1, 'YYYY-MM-DD')
  FROM DUAL
CONNECT BY LEVEL <= (TO_DATE('{종료일자}', 'YYYYMMDD')-TO_DATE('{시작일자}', 'YYYYMMDD')+1)

 

 

여기서 살짝 더 꼬아서 이런식으로 레코드를 만들면 날짜별 기준으로 레코드가 만들어져

 

무조건 날짜 기준으로 OUTER JOIN을 걸어서 사용해야 한다.

 

그러나 어떠한 레코드별 모든 날짜 레코드를 만들고 싶을 경우는

 

CROSS JOIN(교차조인)을 이용해 사용하면 된다.

 

 

그룹별 날짜 레코드 만들기

-- 정렬 조건은 생략하고 나중에 처리해도 된다.
SELECT G.{컬럼}
  FROM {테이블} G
     , (SELECT TO_CHAR(TO_DATE('{시작일자}', 'YYYYMMDD')+LEVEL-1, 'YYYY-MM-DD') AS DAY
          FROM DUAL CONNECT BY LEVEL <= (TO_DATE('{종료일자}', 'YYYYMMDD')-TO_DATE('{시작일자}', 'YYYYMMDD')+1) ) D
 ORDER BY G.{컬럼}, D.DAY
Posted by 미주엘