반응형

방법- M:M 관계의 조인을 해결하거나 Full Outer Join을 대체하는 용도로 Union All을 활욜할 수 있다.

 

목적 - 부서별판매계획과 채널별판매실적 테이블이 있다. 이 두 테이블을 이용해 월별로 각 상품의 계획 대비 판매 실적을 집계하려고 한다.

 

1) 1차 단계 - DBMS와 버전에 따라 Full Outer Join을 비효율적으로 처리하기도 한다. 한 테이블을 두 번씩 액세스하기도 한다.

 

SELECT NVL(A.상품, B.상품) AS 상품

, NVL(A.계획연월, B.판매연월) AS 연월

, NVL(계획수량, 0) 계획수량

, NVL(판매수량, 0) 판매수량

FROM

(SELECT 상품, 계획연월, SUM(계획수량) 계획수량

FROM 부서별판매계획

WHERE 계획연월 BETWEEN '201201' AND '201203'

GROUP BY 상품, 계획연월

) A

FULL OUTER JOIN

(SELECT 상품, 판매연월, SUM(판매수량)

FROM 채널별판매실적

WHERE 판매연월 BETWEEN '201201' AND '201203'

GROUP BY 상품, 판매연월

) B

ON A.상품 = B.상품

AND A.계획연월 = B.판매연월

;

 

 

2) 2차 단계 - 조금 더 효과적인 방법이 될 수 있다.

                 - Union All을 이용하면 M:M 관계의 조인이나 Full Outer Join을 쉽게 해결할 수 있다.

                 - SQL Server에선 NVL 대신 ISNULL 함수를 사용하고, TO_NUMBER 대신 CAST 함수를 사용하기 바란다.

 

SELECT '계획' AS 구분, 상품, 계획연월 AS 연월, 판매부서, NULL AS 판매채널

, 계획수량, TO_NUMBER(NULL) AS 실적수량

FROM 부서별판매계획

WHERE 계획연월 BETWEEN '201201' AND '201203'

UNION ALL

SELECT '실적', 상품, 판매연월 AS 연월, NULL AS 판매부서, 판매채널

, TO_NUMBER(NULL) AS 계획수량, 판매수량

FROM 채널판매실적

WHERE 판매연월 BETWEEN '201201' AND '201203'

;

 

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

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

-- 위의 전체 집합을 상품, 연월 기준으로 GROUP BY하면서 계획수량과 실적수량을 집계해 보자.

-- 아래와 같이 월별 판매계획과 실적을 대비해 보져줄 수 있다.

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

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

 

 

SELECT 상품, 연월, NVL(SUM(계획수량), 0) AS 계획수량, NVL(SUM(실적수량), 0) AS 실적수량

FROM (

SELECT '계획' AS 구분, 상품, 계획연월 AS 연월, 판매부서, NULL AS 판매채널

, 계획수량, TO_NUMBER(NULL) AS 실적수량

FROM 부서별판매계획

WHERE 계획연월 BETWEEN '201201' AND '201203'

UNION ALL

SELECT '실적', 상품, 판매연월 AS 연월, NULL AS 판매부서, 판매채널

, TO_NUMBER(NULL) AS 계획수량, 판매수량

FROM 채널판매실적

WHERE 판매연월 BETWEEN '201201' AND '201203'

) A

GROUP BY 상품, 연월

;

반응형