안녕하세요 많은 고민 끝에 질문 올립니다.
3개의 테이블을 조인하려고 합니다.
테이블은 다음과 같습니다.
1. 차량 정보 테이블 VEHIC_MST
ex)
| VEHIC_NO (차량구분번호) PK | INFO(정보 컬럼들) |
| KA1234 | ... |
| KA1235 | ... |
| ... | ... |
2. 쿠폰 정보 테이블 COUPON_MST
| CUPN_BUSI (쿠폰종류) PK | CUPN_BASE_NO (쿠폰 기준번호) PK | CUPN_AMT (쿠폰금액) |
| SV | 10001 | 50000 |
| SV | 20001 | 50000 |
| MK | 10001 | 50000 |
| MK | 20001 | 100000 |
| ... | ... | ... |
3. 쿠폰 상세 테이블 COUPON_DETL (차량별로 어떤 쿠폰이 발행되었는지)
| CUPN_BUSI(쿠폰종류) PK | CUPN_BASE_NO PK | VEHIC_NO |
| SV | 10001 | KA1234 |
| MK | 10001 | KA1234 |
| MK | 20001 | KA1235 |
원하는 결과입니다.
특정 쿠폰의 발행 총액을 계산하여 차량테이블 옆에 열 하나를 추가하고 싶습니다.
EX) CUPN_BUSI='MK' , CUPN_BASE_NO ='20001' 인 쿠폰 총액을 SUM
발행된 해당쿠폰이 없으면 SUM은 0
| VEHIC_NO | INFO | SUM(CUPN_AMT) |
| KA1234 | ... | 0 |
| KA1235 | ... | 100000 |
| ... | ... | ... |
매우 간단한 조인 같은데 계속 해봐도 SUM이 0인 행이 나타나지 않아서 질문 올립니다..
DB는 오라클입니다.
고수님들 부탁드려요.
감사합니다.
WITH VEHIC_MST AS (
SELECT 'KA1234' VEHIC_NO, 'aaa' INFO FROM DUAL UNION ALL
SELECT 'KA1235' VEHIC_NO, 'bbb' INFO FROM DUAL UNION ALL
SELECT 'KA1236' VEHIC_NO, 'ccc' INFO FROM DUAL UNION ALL
SELECT 'KA1237' VEHIC_NO, 'ddd' INFO FROM DUAL
)
, COUPON_MST AS (
SELECT 'SV' CUPN_BUSI, '10001' CUPN_BASE_NO, 50000 CUPN_AMT FROM DUAL UNION ALL
SELECT 'SV' CUPN_BUSI, '20001' CUPN_BASE_NO, 50000 CUPN_AMT FROM DUAL UNION ALL
SELECT 'MK' CUPN_BUSI, '10001' CUPN_BASE_NO, 50000 CUPN_AMT FROM DUAL UNION ALL
SELECT 'MK' CUPN_BUSI, '20001' CUPN_BASE_NO, 100000 CUPN_AMT FROM DUAL
)
, COUPON_DETL AS (
SELECT 'SV' CUPN_BUSI, '10001' CUPN_BASE_NO, 'KA1234' VEHIC_NO FROM DUAL UNION ALL
SELECT 'MK' CUPN_BUSI, '10001' CUPN_BASE_NO, 'KA1234' VEHIC_NO FROM DUAL UNION ALL
SELECT 'MK' CUPN_BUSI, '20001' CUPN_BASE_NO, 'KA1235' VEHIC_NO FROM DUAL
)
SELECT A.VEHIC_NO, A.INFO, NVL(D.CUPN_AMT, 0) CUPN_AMT
FROM VEHIC_MST A
, (SELECT C.VEHIC_NO, SUM(B.CUPN_AMT) CUPN_AMT
FROM COUPON_MST B
, COUPON_DETL C
WHERE C.CUPN_BUSI='MK'
AND C.CUPN_BASE_NO ='20001'
AND B.CUPN_BUSI = C.CUPN_BUSI
AND B.CUPN_BASE_NO = C.CUPN_BASE_NO
GROUP BY C.VEHIC_NO
) D
WHERE A.VEHIC_NO = D.VEHIC_NO(+)
ORDER BY A.VEHIC_NO
;
원하는 결과로 잘 나옵니다ㅜㅜ
많이 배워갑니다.
정말 감사합니다 동동동님!
-- ANSI JOIN --
SELECT a.vehic_no
, a.info1
, a.info2
, NVL(SUM(c.cupn_amt), 0) cupn_amt
FROM vehic_mst a
LEFT OUTER JOIN coupon_detl b
ON b.vehic_no = a.vehic_no
AND b.cupn_busi = 'MK'
AND b.cupn_base_no = '20001'
LEFT OUTER JOIN coupon_mst c
ON b.cupn_busi = c.cupn_busi
AND b.cupn_base_no = c.cupn_base_no
GROUP BY a.vehic_no, a.info1, a.info2
;
-- Oracle 전통 JOIN --
SELECT a.vehic_no
, a.info1
, a.info2
, NVL(SUM(c.cupn_amt), 0) cupn_amt
FROM vehic_mst a
, coupon_detl b
, coupon_mst c
WHERE b.vehic_no (+) = a.vehic_no
AND b.cupn_busi (+) = 'MK'
AND b.cupn_base_no(+) = '20001'
ON c.cupn_busi (+) = b.cupn_busi
AND c.cupn_base_no(+) = b.cupn_base_no
GROUP BY a.vehic_no, a.info1, a.info2
;
오 잘 나오네요!!
많은 도움이 되었습니다.
감사합니다 마농님!!