안녕하세요. 앞서 질문한 내용에 이어서 문의 다시 드립니다.
우선 테이블은 아래와 같습니다.
이름 | 값 |
A | 0 |
A | 8 |
B | 0 |
C | 8 |
이중에서 만약 코드값이 1이면 -> 값이 0이 포함된 값은 모두 추출하고, 코드값이 2이면 -> 값이 8인것만 추출하고 싶습니다.
코드값 1선택시 원하는 결과는 아래와 같습니다.(A는 값 0과 8을 가지고 있으므로 포함, B는 0만 가지고 있으므로 포함)
이름 | 값 |
A | 0 |
A | 8 |
B | 0 |
코드값 2선택시 원하는 결과는 아래와 같습니다.(이름 A는 값 0과 8을 가지고 있으므로 제외)
이름 | 값 |
C | 8 |
이걸 하나의 쿼리로 만들 수 있을까요?
감사합니다.
with t as ( select 'a' name, 0 val from dual union all select 'a', 8 from dual union all select 'b', 0 from dual union all select 'c', 8 from dual ) select name, val from (select name, val , decode(:code, 1, 1, 0) cd , count(decode(val, 0, 1)) over(partition by name) gb from t) where 1=1 and cd = gb ;
WITH t AS ( SELECT 'A' name, 0 value FROM dual UNION ALL SELECT 'A', 8 FROM dual UNION ALL SELECT 'B', 0 FROM dual UNION ALL SELECT 'C', 8 FROM dual ) SELECT * FROM (SELECT name, value , COUNT(DECODE(value, 0, 1)) OVER(PARTITION BY name) cnt_0 , COUNT(DECODE(value, 8, 1)) OVER(PARTITION BY name) cnt_8 FROM t ) WHERE (:code = 0 AND cnt_0 > 0) OR (:code = 8 AND cnt_0 = 0 AND cnt_8 > 0) ;