처음에 보고 매우 헷갈렸다.
근데 몇번 실행해보니 감이 잡히더라.
역시 백문이 불여일견이다.

우선 이름도 생소한 Partition Outer Join이 어떨 때 쓰이는지를 알아보자.


날짜별, 매체별 주문 테이블이 있다.



그리고 매체정보 테이블이 있다.

 

이 두 테이블을 JOIN하여 아래와 같은 결과를 도출하고자 한다.

 

일단 MEDIA_NM이 빠짐없이 나와야하므로 드라이빙 테이블은 매체정보 테이블이 되겠다.
이 매체정보 테이블을 OUTER JOIN 한다. 뭐랑? 
주문 테이블을 ORD_DT 컬럼으로 그룹핑한 애들이랑..
그러려면 주문 테이블을 ORD_DT 기준으로 PARTITION 해야 하므로 
PARTITION BY 구문에는 ORD_DT 컬럼이 들어가게 된다.

SELECT TO_CHAR(ORD_DT, 'YYYYMMDD') ORD_DT, 
             M.MEDIA_NM, 
             NVL(SUM(O.ORD_AMT), 0) SUM
  FROM MEDIA M
    LEFT OUTER JOIN ORD_HIST O PARTITION BY (O.ORD_DT)
      ON O.MEDIA_CD = M.MEDIA_CD
GROUP BY ORD_DT, MEDIA_NM
ORDER BY O.ORD_DT;

 

한술 더 떠 요런 식으로 소계까지 도출하고자 한다면 
아래와 같이 쿼리를 작성해주면 된다.

SELECT TO_CHAR(ORD_DT, 'YYYYMMDD') ORD_DT, 
             DECODE(M.MEDIA_NM,NULL,'소계',M.MEDIA_NM) MEDIA_NM, 
             NVL(SUM(O.ORD_AMT), 0) SUM
  FROM MEDIA M
     LEFT OUTER JOIN ORD_HIST O PARTITION BY (O.ORD_DT)
       ON O.MEDIA_CD = M.MEDIA_CD
GROUP BY ORD_DT, ROLLUP(MEDIA_NM)
ORDER BY O.ORD_DT;

 

이렇듯,
안 해봐서 어려운거지 알고나면 아무것도 아니다.

by 사용자 정미나 2019.08.07 18:59