Union All을 활용한 M:M 관계의 조인(고급 SQL 활용) - SQL전문가 가이드 p.677~p.680
개발 및 관리/Oracle 9i, 10g, 11g, 12c, 19c 2012. 10. 26. 11:27방법- 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 상품, 연월
;
'개발 및 관리 > Oracle 9i, 10g, 11g, 12c, 19c' 카테고리의 다른 글
Analytic Fuction(윈도우 함수) 활용(고급 SQL 활용) - SQL전문가 가이드 p.685~p.686 (0) | 2012.10.26 |
---|---|
페이징 처리(고급 SQL 활용) - SQL전문가 가이드 p.683~p.684 (0) | 2012.10.26 |
CASE문 활용(고급 SQL 활용) - SQL전문가 가이드 p.674~p.675 (0) | 2012.10.26 |
Between 조인 - SQL전문가 가이드 p.664 (0) | 2012.10.25 |
부등호 조인 - SQL전문가 가이드 p.659 (0) | 2012.10.25 |