3개 테이블 조인 질문입니다.. 3

by 초보자 [SQL Query] [2023.05.17 11:26:20]


안녕하세요 많은 고민 끝에 질문 올립니다.

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는 오라클입니다.

고수님들 부탁드려요.

감사합니다. 

 

by 동동동 [2023.05.17 12:34:08]
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
;

 


by 초보자 [2023.05.17 13:09:05]

원하는 결과로 잘 나옵니다ㅜㅜ

많이 배워갑니다.

정말 감사합니다 동동동님!


by 마농 [2023.05.17 13:35:47]
-- 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
;

 


by 초보자 [2023.05.18 11:08:08]

오 잘 나오네요!!

많은 도움이 되었습니다.

감사합니다 마농님!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입