안녕하십니까 고수님들~!
쿼리 질문올립니다 ㅎ
책을 열심히 보고 있는데 나이가 들어서 배우는 중이라 코딩을 새로하는 것이 참 어렵습니다.
쿼리문 작성 가이드 좀 여쭤보려고 문의드립니다 ㅠ
아래와 같은 테이블 "X"가 있다고 가정을 하고,
테이블 : X
ID | DX1 | DX2 | SEQ | OUT |
1 | A | B | 1 | 1 |
1 | A | B | 1 | 2 |
1 | A | B | 2 | 1 |
1 | A | B | 2 | 2 |
1 | B | C | 3 | 1 |
1 | D | 4 | 1 | |
2 | A | D | 5 | 1 |
2 | E | 6 | 1 | |
2 | B | A | 7 | 1 |
2 | A | C | 8 | 2 |
2 | A | C | 8 | 2 |
3 | B | C | 9 | 1 |
3 | D | 10 | 1 | |
3 | D | 10 | 2 | |
3 | D | 10 | 3 | |
4 | E | F | 11 | 1 |
4 | E | C | 12 | 1 |
4 | G | 13 | 2 | |
4 | G | 13 | 3 | |
5 | B | F | 14 | 1 |
5 | B | D | 15 | 1 |
5 | B | D | 15 | 2 |
6 | E | F | 16 | 1 |
6 | E | G | 17 | 1 |
쿼리문을 실행 후 아래와 같은 결과를 얻고 싶습니다.
테이블 : Y
ID | NO_AB | NO_C |
1 | 2 | 1 |
2 | 3 | 1 |
3 | 1 | 1 |
4 | 0 | 1 |
5 | 2 | 0 |
6 | 0 | 0 |
원했던 조건을 말씀드리면,
1. ID행의 중복을 없애고, 하나의 ID행만을 가지는 테이블 Y를 새로 만들고자 하며,
2. 해당 ID에서 DX1 또는 DX2 열에서 A 또는 B값이 있을 경우 테이블 Y에 새로운 열인 N0_AB에 0부터 시작하여 1씩 증가시키려고 합니다. 단, SEQ값이 변할 때만 1씩 증가시키고자 합니다 (테이블 X의 이전 행에서의 SEQ값이 동일할 때는 카운팅을 유지). 테이블 Y의 ID 1,2,3,5 경우
3. 해당 ID에서 DX1 또는 DX2 열에서 C값이 있을 경우, 마찬가지로 테이블 Y에 새로운 열인 N0_C에 0부터 시작하여 1씩 증가시키려고 합니다. 단, SEQ값이 변할 때만 1씩 증가시키고자 합니다 (테이블 X의 이전 행에서의 SEQ값이 동일할 때는 카운팅을 유지). ---> 테이블 Y의 ID 1,2,3,4의 경우
4. 테이블 X의 DX1 또는 DX2에 A,B,C에 해당하는 것이 없을 때는 해당 ID의 N0_AB와 N0_C의 열의 값을 O으로 둡니다. ---> 테이블 Y의 ID 6 경우
조금 복잡하긴 합니다만, IF 문 재귀문 해 봐도 영 이상하게 결과가 나와서 고수님들의 도움을 좀 구하고자 질문드립니다. 복잡해서 답을 주시기 어려우시면 가이드라인이라도 주시면 너무 감사하겠습니다~!
도와주셔요 ㅠ
하기 순서대로 진행하시면 됩니다.
1. 중복제거
Row_Number() Over (Partition By ID,DX1,DX2 Order By ID,DX1,DX2)
상기 쿼리 결과값중 1인 것만 가지고 오면 됨
2.DX1, DX2 컬럼에 있는 값을 case when 으로 판별
1) 조건 만족시 = 1
2) ELSE = 0
3. ID 로 그룹핑하고, 2에서 CASE WHEN 한 값을 SUMMARY 처리
하기 쿼리 참고하세요..
---쿼리시작---
;with tblA(ID,DX1,DX2,SEQ,OUT) As
(
Select 1,'A','B',1 ,1 Union All
Select 1,'A','B',1 ,2 Union All
Select 1,'A','B',2 ,1 Union All
Select 1,'A','B',2 ,2 Union All
Select 1,'B','C',3 ,1 Union All
Select 1,'D',' ',4 ,1 Union All
Select 2,'A','D',5 ,1 Union All
Select 2,'E',' ',6 ,1 Union All
Select 2,'B','A',7 ,1 Union All
Select 2,'A','C',8 ,2 Union All
Select 2,'A','C',8 ,2 Union All
Select 3,'B','C',9 ,1 Union All
Select 3,'D',' ',10,1 Union All
Select 3,'D',' ',10,2 Union All
Select 3,'D',' ',10,3 Union All
Select 4,'E','F',11,1 Union All
Select 4,'E','C',12,1 Union All
Select 4,'G',' ',13,2 Union All
Select 4,'G',' ',13,3 Union All
Select 5,'B','F',14,1 Union All
Select 5,'B','D',15,1 Union All
Select 5,'B','D',15,2 Union All
Select 6,'E','F',16,1 Union All
Select 6,'E','G',17,1
)
,tblB (ID,DX1,DX2,SEQ,OUT,sn)
As
(
Select a.*
,Row_Number() Over(Partition By a.ID,a.DX1,a.DX2 Order By a.ID asc,a.DX1 asc,a.DX2 asc)
From tblA a
)
,tblC (ID,DX1,DX2,SEQ,OUT)
As
(
Select a.ID
,a.DX1
,a.DX2
,a.SEQ
,a.OUT
From tblB a
Where a.sn = 1
)
Select a.ID
,Sum(a.NO_AB) As NO_AB
,Sum(a.NO_C ) As NO_C
From (
Select x.ID
,(Case When x.DX1 = 'A' Then '1'
When x.DX1 = 'B' Then '1'
When x.DX2 = 'A' Then '1'
When x.DX2 = 'B' Then '1'
Else 0
End
) As NO_AB
,(Case When x.DX1 = 'C' Then '1'
When x.DX2 = 'C' Then '1'
Else 0
End
) As NO_C
From tblC x
) a
Group By a.ID