by 짱구 [SQL Query] oracle outer join join [2014.06.12 18:15:15]
쿼리는 아래와 같습니다.
SELECT T2.CD,
, COUNT (*) CNT
, SUM(CNT) SUB_TOTAL
, ROW_NUMBER () OVER (ORDER BY T2.CD) RID
FROM TB_CO T1
, DTLD T2
, DATA T3
WHERE T1.NO = T3.NO
AND T1.TYPE(+) = T2.DTLD_CD
AND T2.MSTR_CD = '4100'
AND T1.SEQ(+) = (SELECT MAX (SEQ)
FROM TB_CO
WHERE NO = T1.NO)
AND T1.STATE_CODE IN ('45000003', '45000005', '45000002')
AND T3.YEAR = '2014'
AND T3.YN = 'Y'
AND T3.OPEN > 0
GROUP BY T2.DTLD_CD
SELECT *
FROM DTLD
WHERE MSTR_CD = '4100'
하면 아래와 같이 나옵니다.
-------------------------
CD NM
100 가
200 나
300 다
------------------------
위에 쿼리를 하면 값이 없어도 아래와 같이 out join 효과를 보고싶습니다.
----------------
100 0 0 1
200 0 0 2
300 0 0 3
----------------
부탁드립니다.
감사합니다.
-- SUM(cnt) sub_total 의 cnt 가 뭔지 의문이네요? -- 일단 t3 의 항목으로 간주하고 풀어보겠습니다. -- 각 테이블의 데이터가 어떤 형태로 어떤 관계로 되어 있는지를 -- 알아야만 효율적인 쿼리를 작성 할 수 있는데... SELECT t2.dtld_cd , COUNT(*) cnt , NVL(SUM(t4.cnt), 0) sub_total , ROW_NUMBER() OVER(ORDER BY t2.dtld_cd) rid FROM dtld t2 , (SELECT * FROM (SELECT t2.dtld_cd , t3.cnt , ROW_NUMBER() OVER(PARTITION BY t2.no ORDER BY t2.seq DESC) rn FROM tb_co t1 , dtld t2 , data t3 WHERE t1.no = t3.no AND t1.type = t2.dtld_cd AND t2.mstr_cd = '4100' AND t1.state_code IN ('45000003', '45000005', '45000002') AND t3.year = '2014' AND t3.yn = 'Y' AND t3.open > 0 ) WHERE rn = 1 ) t4 WHERE t2.dtld_cd = t4.dtld_cd(+) AND t2.mstr_cd = '4100' GROUP BY t2.dtld_cd ;