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으로 왼쪽 처럼 출력이됩니다.
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. 질문의 쿼리는
- 말도 안되는 쿼리네요.
- 인라인뷰 안쪽 컬럼명과 바깥쪽 컬럼명이 전혀 안맞네요.
- 실제로 돌아가는 쿼리를 가지고 질문해 주세요.