두 테이블의 관계가 1:N인 테이블을 이용한 합계를 구하려고합니다.
1.A테이블
id | value |
A | A1 |
B | A1 |
C | B1 |
D | B1 |
2.B테이블
seq | id | type | rslt |
1 | A | D | Y |
2 | A | F | Y |
3 | B | D | |
4 | B | E | Y |
5 | B | F | Y |
6 | B | G | Y |
7 | C | D | Y |
8 | C | F | Y |
9 | C | G | Y |
3.결과테이블
value | total | D | E | F | G |
A1 | 2 | 1 | 1 | 2 | 1 |
B1 | 2 | 1 | 0 | 1 | 1 |
1.A table의 value컬럼으로 그룹
2.A table의 id와 B table의 id로 1:N left 조인
3.조인된 B table에서 type이 컬럼이 됨
4.카운트는 해당 type중 rslt가 Y인 컬럼만 합산
D,E,F,G컬럼은 case구문으로 가능한데
total부분을 가져올때 id중복이 없이 value별로 count를 하고싶습니다.
(조인없이 A table을 카운트하는 것처럼)
left 조인을 하게되니 1:N이여서 Btable의 개수만큼 중복이 되어 합산이 됩니다
방법이 있을까요?.
-- 답에만 맞췄습니다. WITH A (ID,VALUE) AS ( SELECT 'A' , 'A1' FROM DUAL UNION ALL SELECT 'B' , 'A1' FROM DUAL UNION ALL SELECT 'C' , 'B1' FROM DUAL UNION ALL SELECT 'D' , 'B1' FROM DUAL ), B (SEQ,ID,TYPE,RSLT) AS ( SELECT 1 , 'A' , 'D' , 'Y' FROM DUAL UNION ALL SELECT 1 , 'A' , 'F' , 'Y' FROM DUAL UNION ALL SELECT 1 , 'B' , 'D' , '' FROM DUAL UNION ALL SELECT 1 , 'B' , 'E' , 'Y' FROM DUAL UNION ALL SELECT 1 , 'B' , 'F' , 'Y' FROM DUAL UNION ALL SELECT 1 , 'B' , 'G' , 'Y' FROM DUAL UNION ALL SELECT 1 , 'C' , 'D' , 'Y' FROM DUAL UNION ALL SELECT 1 , 'C' , 'F' , 'Y' FROM DUAL UNION ALL SELECT 1 , 'C' , 'G' , 'Y' FROM DUAL ) SELECT VALUE , COUNT(DISTINCT A.ID) CNT , COUNT(CASE WHEN TYPE = 'D' AND RSLT = 'Y' THEN 1 END ) AS D , COUNT(CASE WHEN TYPE = 'E' AND RSLT = 'Y' THEN 1 END ) AS E , COUNT(CASE WHEN TYPE = 'F' AND RSLT = 'Y' THEN 1 END ) AS F , COUNT(CASE WHEN TYPE = 'G' AND RSLT = 'Y' THEN 1 END ) AS G FROM A , B WHERE A.ID = B.ID(+) GROUP BY VALUE