조건 집합 쿼리.. 한번에 안될까요? 0 7 1,204

by 통합문서 [2016.04.08 17:31:20]


id  status

001    0

001    1

001    2

001    3

001    1

위와 같은 데이터가 있다고 가정할때 

id값은 동일하고 status 값이 전부 0 이면 0이고,

                    전부 3이면 3이고,

                    그외에는 1이 나오게 case min, max로 해보는데 생각보다 쉽지 않네요..

0,3 일때 1이 나오게 해야하는데 경우의 수가 머릿속에서 정리가 안되네요ㅠ

by 신이만든짝퉁 [2016.04.08 17:44:49]
with t(ids, status) as (
select '001', 0 from dual union all
select '001', 1 from dual union all
select '001', 2 from dual union all
select '001', 3 from dual union all
select '002', 3 from dual union all
select '002', 3 from dual union all
select '003', 0 from dual union all
select '003', 0 from dual)
SELECT ids, case when sum(nvl(status,0)) = 0 then 0
                 when avg(nvl(status,0)) = 3 then 3
                 else 1
            end status
  FROM T
group by ids  ;

혹시 이런형태를 원하신다면

SELECT IDS, CASE WHEN SUM_STATUS = 0 THEN 0 
                 WHEN AVG_STATUS = 3 THEN 3
                 ELSE 1
            END STATUS
  FROM (SELECT IDS
             , STATUS
             , SUM(NVL(STATUS, 0)) OVER(PARTITION BY IDS) SUM_STATUS
             , AVG(NVL(STATUS, 0)) OVER(PARTITION BY IDS) AVG_STATUS
          FROM T);

 


by 통합문서 [2016.04.08 17:57:22]

답변 감사드립니다.

status값이 문자열이라 to_number로 하면 되긴하는데..

문자열인 경우로 처리하고 싶은데 다른 방법 없을까요?ㅜ


by 신이만든짝퉁 [2016.04.08 18:04:42]

네. 아래 jkson님 답변으로 처리하시면 되겠네요~~

 


by 창조의날개 [2016.04.08 17:53:47]

SELECT IDS
     , DECODE(AVG(STATUS),0,0,3,3,1) STATUS
FROM T
GROUP BY IDS
;

 


by 신이만든짝퉁 [2016.04.08 17:56:38]

역시 세상엔 고수가 많습니다. ^^

 


by jkson [2016.04.08 18:01:28]
SELECT IDS, DECODE(MAX(STATUS) || MIN(STATUS), '00', '0', '33', '3', '1') STATUS
  FROM T
GROUP BY IDS;

 


by 통합문서 [2016.04.08 18:29:21]

감사합니다. DB가 오라클이 아니라 decode가 안됩니다.

반드시 case when문으로 처리하고싶은데..  참조해서 하겠습니다.

 

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