case when+ 계산식 질문입니다 0 3 1,484

by 정유석 [Oracle 기초] [2017.05.16 09:41:52]


select
case when sale >= '100' then '100'
else sale
end num
from(
        select
                case when c_ex > '0' then decode(round((a_ex/ c_ex) *100,2),null,'0',round((n_ex/ c_ex) *100,2))
                else '0'
                end num
        from(
                select
                sum(aex) over(partition by ITEM,substr(ddate,1,6) order by ddate) n_act_qty,
                sum(cex) over(partition by ITEM,substr(ddate,1,6) order by ddate) n_csd_qty
                from abc_mart
        )
)

ddate,aex,cex 유형은 varchar2(80) 이구요

위의 계산으로하면

100    138.41
100    120.89
100    107.3
100    96.46
100    96.46
100    91.83
100    87.61

이렇게 결과값이 나옵니다

100이상은 100 100이하는 그대로 출력이되야하는데 모두 100으로 왼쪽 처럼 출력이됩니다.

by 마농 [2017.05.16 09:57:51]

1. 타입 지정이 틀려서 그렇습니다.
 - 숫자로 지정되어야 할 항목들(sale, a_ex, c_ex)이 문자형으로 지정되어 있네요.
 - 조건 줄때도 문자가 아닌 숫자로 주어야 맞겠네요.
 - 컬럼 타입을 바꾸는게 좋구요.
 - 타입 변경이 안된다면 조건값('100', '0') 만이라도 숫자(100, 0)로 주셔야 합니다.
2. 0으로 나누는 것에 대한 복잡한 처리는
 - 분모의 0 을 널로 바꾸어 계산하시면 간결합니다.
 - a_ex / NULLIF(c_ex, 0)
 - 0 으로 나누는 것 자체가 오류이므로 결과가 널이 나오는게 맞다고 생각합니다.
 - 굳이 0 이 나와야 한다고 생각된다면? NVL 추가하면 됩니다.
 - NVL(a_ex / NULLIF(c_ex, 0), 0)
3. 질문의 쿼리는
 - 말도 안되는 쿼리네요.
 - 인라인뷰 안쪽 컬럼명과 바깥쪽 컬럼명이 전혀 안맞네요.
 - 실제로 돌아가는 쿼리를 가지고 질문해 주세요.


by 정유석 [2017.05.16 10:06:08]

decode(sign(round(nvl(a_ex/ nullif(c_ex,0),0) *100,2)-100),1,100,round(nvl(a_ex/ nullif(c_ex,0),0) *100,2)) 

말씀해주신 함수 적용하여 응용하였습니다 감사합니다!


by 마농 [2017.05.16 10:18:03]

LEAST 함수를 이용하세요.

SELECT NVL(ROUND(LEAST(a_ex / NULLIF(c_ex, 0), 1) * 100, 2), 0) sale
  FROM (SELECT SUM(aex) OVER(PARTITION BY item, SUBSTR(ddate, 1, 6) ORDER BY ddate) a_ex
             , SUM(cex) OVER(PARTITION BY item, SUBSTR(ddate, 1, 6) ORDER BY ddate) c_ex
          FROM abc_mart
        )
;

 

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