grouping 관련된 쿼리를 어드바이스 부탁드리겠습니다. 0 5 2,456

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ㅠ

by 마농 [2015.02.11 09:37:38]

Oracle 맞나요? From dual 이 없는 걸로 봐서는 MSSQL 이나 MySQL 일 듯?


by 김태원 [2015.02.11 09:45:15]

아 급하게 쓰다보니 FROM DUAL이 빠졌군요. 오라클 맞습니다 ^^;;


by 마농 [2015.02.11 09:57:11]
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
;

 


by 김태원 [2015.02.11 10:36:18]

우왓... 이런 유형의 CASE COUNT PARTITION BY는 처음 보네요...

OVER PARTITION BY 부분이 제일 신기한데... 이 부분 원리에 대해서 다시 한번 생각해보아야 겠네요...

감사합니다 __)


by 백면서생 [2015.02.11 10:53:55]

-- 지나간 어느 한분의 질문때문에 질문내용 / 카테고리에서 DB를 꼼꼼하게 살피는 습관이 ㅋ
-- 저도 한번

select col1,col2,col3
        ,nvl2(max(col1) over (partition by col3),'Y','N') col4
from t

 

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