코드 값에 따른 결과값 조회 0 6 608

by dnfrkwhr [Oracle 기초] [2019.02.25 12:45:33]


안녕하세요. 앞서 질문한 내용에 이어서 문의 다시 드립니다.

우선 테이블은 아래와 같습니다.

이름
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

이걸 하나의 쿼리로 만들 수 있을까요?

감사합니다.

by 소주쵝오 [2019.02.25 13:40:14]
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
;

 


by dnfrkwhr [2019.02.25 14:23:38]

답변감사합니다. 코드1 선택이 조회되는 값은 어떻게 되나요?


by 소주쵝오 [2019.02.25 14:39:31]

:code 입력값으로 1 또는 2를 넣어서 수행해보세요~


by dnfrkwhr [2019.02.25 15:40:48]

죄송한데요. 코드값을 잘못 알려드렸습니다. 위에 게시한 코드값이 1은 0으로, 2는 8로 될때 위와 같이 나오게 하려면 어떻게 하나요? 다시 한번 죄송합니다. 


by 마농 [2019.02.26 09:19:39]
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)
;

 


by dnfrkwhr [2019.02.26 10:32:26]

답변 감사드립니다. 좋은날 되세요!!!

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