조건을 포함하는 데이터 조회 0 11 1,111

by 쭈니아빠 [SQL Query] [2013.09.26 10:31:29]



오라클클럽 회원님들 안녕하세요.

Q&A를 통해 여러가지 방법을 생각해보다 해결이 안되어 이렇게 글을 올립니다.

문의 드릴 내용은 다음과 같습니다.

COL1    COL2
A     001
A     003

B     001
B     002
C     001
C     003
C     004

D     001
D     002
D     004
D     005

위와 같은 데이터에서 COL2에 '001' 과 '003'을 반드시 포함하고 있는 데이터를 추출하려고 합니다.

즉, 결과는 Bold체로 되어 있는 부분인
A    001
A    003
C    001
C    003
C    004
와 같이 나와야 하는 것입니다.

비슷한 문의 게시글을 읽고 응용을 해보려 했지만 해결이 좀처럼 안되네요.
회원님들의 도움 부탁드립니다...
감사합니다.
by 우리집아찌 [2013.09.26 11:04:22]
-- 답에만 맞추었습니다. 
WITH T AS ( 
SELECT 'A' col1, '001' col2 FROM DUAL UNION ALL
SELECT 'A' col1, '003' col2 FROM DUAL UNION ALL
SELECT 'B' col1, '001' col2 FROM DUAL UNION ALL
SELECT 'B' col1, '002' col2 FROM DUAL UNION ALL
SELECT 'C' col1, '001' col2 FROM DUAL UNION ALL
SELECT 'C' col1, '003' col2 FROM DUAL UNION ALL
SELECT 'C' col1, '004' col2 FROM DUAL UNION ALL
SELECT 'D' col1, '001' col2 FROM DUAL UNION ALL
SELECT 'D' col1, '001' col2 FROM DUAL UNION ALL
SELECT 'D' col1, '005' col2 FROM DUAL UNION ALL
SELECT 'D' col1, '005' col2 FROM DUAL 
) 
SELECT * 
 FROM T 
 WHERE col1 IN ( SELECT col1 FROM T 
 GROUP BY col1 
 HAVING COUNT(DISTINCT DECODE(col2,'001',col2,'003',col2)) = 2 ) 
ORDER BY col1 , col2 

by 우리집아찌 [2013.09.26 11:22:16]

데이타가 중복 날수있어서 쿼리 수정했어요


by 마농 [2013.09.26 11:24:02]
WITH t AS
(
SELECT 'A' col1, '001' col2 FROM dual
UNION ALL SELECT 'A', '003' FROM dual
UNION ALL SELECT 'B', '001' FROM dual
UNION ALL SELECT 'B', '002' FROM dual
UNION ALL SELECT 'C', '001' FROM dual
UNION ALL SELECT 'C', '003' FROM dual
UNION ALL SELECT 'C', '004' FROM dual
UNION ALL SELECT 'D', '001' FROM dual
UNION ALL SELECT 'D', '002' FROM dual
UNION ALL SELECT 'D', '004' FROM dual
UNION ALL SELECT 'D', '005' FROM dual
)
SELECT col1, col2
  FROM (SELECT col1, col2
             , COUNT(CASE WHEN col2 IN ('001','003') THEN col2 END)
               OVER(PARTITION BY col1) cnt
          FROM t
        )
 WHERE cnt = 2
;

by 쭈니아빠 [2013.09.26 13:22:39]
두분 너무 감사드립니다.!!
단, CNT로 처리를 하니까 정확한 데이터가 나오지 않는 경우가 생깁니다.

예를 들어
E 002
E 002
E 003
E 003
데이터가 추가로 있는 경우에는
A 001
A 003
C 001
C 003
C 004
E 002
E 002
E 003
E 003
로 나오게 됩니다.

CNT를 비교하지 않고
'001' 과 '003'을 반드시 포함하고 있는 경우의 데이터를 뽑으려고 합니다.

by 우리집아찌 [2013.09.26 18:15:46]
잘되는데요~

by 우리집아찌 [2013.09.26 18:17:02]
-- 마농님꺼 수정했어요..
-- 살다보니 이런날도있군요.. ㅋㅋ
SELECT col1, col2 
 FROM (SELECT col1, col2 
       , COUNT(DISTINCT CASE WHEN col2 IN ('001','003') THEN col2 END) 
        OVER(PARTITION BY col1) cnt 
     FROM t 
    ) 
 WHERE cnt = 2 


by 용근님 [2013.09.27 10:08:52]

경축~~ ㅋ


by 우리집아찌 [2013.09.27 10:26:50]

이곳이 성지가 될듯합니다. ㅎㅎ


by 손님 [2013.09.26 18:02:29]
select col1,col2
from (
select co1,col2,
  max(decode(col2,'001',1)) over (partition by col1) chk1,
  max(decode(col2,'003',1)) over (partition by col1) chk2
from table
)
where chk1 =1 and chk2 =1;

by 쭈니아빠 [2013.09.26 18:32:13]
너무 감사합니다.
DISTINCT가 있었네요. ^_^

by 마농 [2013.09.26 19:06:23]

크~
처음에 Distinct 넣었다가 데이터 보고 중복 없을 것 같아 일부러 뺀건데...
질문하실때 예시 데이터는 최대한 실데이터를 반영해 주셔야 좋아요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입