1:N형태의 두 테이블간의 sum 0 2 1,606

by 잔든건 [SQLServer] 1대N MSSQL SQLSERVER [2018.03.13 10:44:08]


두 테이블의 관계가 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의 개수만큼 중복이 되어 합산이 됩니다

 

 

방법이 있을까요?.

 

 

by 우리집아찌 [2018.03.13 10:59:12]
-- 답에만 맞췄습니다.
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
  
  
  

 


by 마농 [2018.03.13 11:01:43]
SELECT a.value
     , COUNT(DISTINCT a.id) cnt
     , COUNT(DECODE(b.type, 'D', 1)) D
     , COUNT(DECODE(b.type, 'E', 1)) E
     , COUNT(DECODE(b.type, 'F', 1)) F
     , COUNT(DECODE(b.type, 'G', 1)) G
  FROM t1 a
  LEFT OUTER JOIN t2 b
    ON a.id = b.id
   AND b.rslt = 'Y'
 GROUP BY a.value
 ORDER BY a.value
;

 

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