by 김태원 [SQL Query] grouping group by [2015.02.11 09:31:36]
아래와 같은 쿼리가 있습니다.
SELECT COL1, COL2, COL3
FROM (
SELECT '1' AS COL1, 'B1' AS COL2, 'C' AS COL3
UNION ALL
SELECT '' AS COL1, 'B2' AS COL2, 'C' AS COL3
UNION ALL
SELECT 'A1' AS COL1, 'B3' AS COL2, 'D' AS COL3
UNION ALL
SELECT 'A2' AS COL1, 'B4' AS COL2, 'D' AS COL3
UNION ALL
SELECT 'A3' AS COL1, 'B5' AS COL2, 'D' AS COL3
UNION ALL
SELECT '' AS COL1, 'B6' AS COL2, 'E' AS COL3
UNION ALL
SELECT '' AS COL1, 'B7' AS COL2, 'E' AS COL3
) A
결과셋을 보면 아래와 같이 나옵니다.
ROW COL1 COL2 COL3
1 1 B1 C
2 B2 C
3 A1 B3 D
4 A2 B4 D
5 A3 B5 D
6 B6 E
7 B7 E
위의 결과를 그대로 보여주면서 COL4를 추가하고 싶습니다.
COL4는 Y OR N으로만 구성된 값인데, 다음과 같은 조건을 가집니다.
- 같은 COL3 그룹 내에서
- COL1 의 값이 1개라도 NOT NULL인 경우는 Y
- COL1의 값이 전부 NULL인 경우는 N
즉 위의 결과에서 원하는 COL4를 추가하면 아래와 같이 됩니다.
ROW COL1 COL2 COL3 COL4
1 1 B1 C Y
2 B2 C Y
3 A1 B3 D Y
4 A2 B4 D Y
5 A3 B5 D Y
6 B6 E N
7 B7 E N
COL1에 값이 1도 있고 A1도 있는 것은 숫자가 아니라 STRING 이라는 의미로 쓴 것입니다.
DECODE, GROUP BY 등등 별의 별 짓거리를 다 해봐도.... 안되네요 -_-
쉽게 풀릴 것 같으면서도...
일단 DECODE를 비롯한 CASE 등의 경우는 1개의 ROW에 대해서만 적용이 되기 때문에 안되더라구요...
같은 GROUP의 COL3이더라도...
쿼리는 위의 쿼리 그대로 사용해보시면 될것 같습니다...
고수님의 쿼리를... 기다려봅니다 ㅠ0ㅠ
WITH t AS ( SELECT '1' col1, 'B1' col2, 'C' col3 FROM dual UNION ALL SELECT '' , 'B2', 'C' FROM dual UNION ALL SELECT 'A1', 'B3', 'D' FROM dual UNION ALL SELECT 'A2', 'B4', 'D' FROM dual UNION ALL SELECT 'A3', 'B5', 'D' FROM dual UNION ALL SELECT '' , 'B6', 'E' FROM dual UNION ALL SELECT '' , 'B7', 'E' FROM dual ) SELECT col1, col2, col3 , CASE COUNT(col1) OVER(PARTITION BY col3) WHEN 0 THEN 'N' ELSE 'Y' END col4 FROM t ;