티스토리 뷰

반응형

---------------------------------------------------------------------------------------

요건) 2013년 월별, 부서별 매출을 출력하시오.

       단, 2013년에 매출이 1개월 이상이 있는 부서는 매출이 없는 월에도 표현이 되어야 하고

            매출은 0으로 출력해야 함.

---------------------------------------------------------------------------------------


SELECT A.YMD

      ,B.dept_no

      ,NVL(B.sales_amt,0)

FROM      

(

   -- 혹시라도 매출이 없는 월도 있을 수 있음으로 201301 ~ 201312월 12개의 행을 가지고 있는

   -- 더미 집합을 만듬.

  SELECT TO_CHAR(ADD_MONTHS(TO_DATE('20121201','yyyymmdd'), level), 'yyyymm') AS ymd

  FROM dual

  CONNECT BY LEVEL <= 12

) A left OUTER JOIN 

(  SELECT sale_ym, dept_no, SUM(sales_amt) AS bill_sum

   FROM TS_SALES   -- 월별 부서 매출 집계

   WHERE sale_ym LIKE '2013%'

   GROUP BY sale_ym, comm_id

 ) B

PARTITION BY (B.dept_no) -- 실적테이블에서 2013년에 실적이 1건이라도 있는 부서를 논리적으로

                                       -- 파티션화해서 실적이 없는 월에도 데이터가 있는 것처럼 보여주는 효과                                        -- 가 있음.

ON A.YMD = B.SALE_YM

ORDER BY 1 

;


Partiton Outer Join이 없었더라면 2013년에 매출이 있는 부서만 별도록 모아서 집합을 만든 다음에 조인에 참여 시키는 번잡함이 필요할 것임.

Partition Outer Join은 Oracle 10g New Feature임으로 10g 이후 버전에서만 동작함.


--- EOF ---

반응형