ORACLE/SQL2016. 4. 6. 17:29
반응형

출처: http://m.blog.yes24.com/metalzang/post/1785694

나누기 연산 하는 경우거나 평균값을 구하는 경우에 분모 값이 0 인 상태에서 연산을 하면 에러(ORA-01476)가 발생하는데...

이 경우 아래와 같은 예제를 활용하시면 해결하실 수 있습니다.

-- ORA-01476: 제수가 0 입니다.
-- 나누기 연산을 하여 값을 구하는 경우

select a/b result
from (select 100 a, 0 b from dual)

-- ORA-01476: 제수가 0 입니다.
-- 두개의 값에 따라 평균값을 구하는 경우
select avg(a/b) result
from (select 100 a, 0 b from dual)

-- NULLIF 함수를 사용하여 처리
-- 분모가 0 인 경우에 결과값은 0
select nvl(avg(a/nullif(b,0)),0) result
from (select 100 a, 0 b from dual)

-- 결과값 : 2, 0.5
select avg(200/100) result from dual
select avg(100/200) result from dual

-- DECODE 함수를 사용하여 처리.
select decode(b,0,0,null,0, a/b) result
from (select 100 a, 0 b from dual)

-- ORA-01476: 제수가 0 입니다.
-- AVG 함수를 사용하는 경우에는 분자/분모 모두 "0"이 아니여야 하므로
-- 아래와 같이 DECODE, NULLIF 함수를 사용하면 해결할 수 있음.
select decode(sum(b),0,0,null,0, avg(a/b)) result
from (
select 1001 a, 16 b from dual union all
select 2002 a, 10 b from dual
)

-- 131.38125 결과값
-- ROUND 함수로 인한 결과값 반올림(131.4)
select ROUND(decode(sum(b),0,0,null,0, avg(a/b)),1) result
from (
select 1001 a, 16 b from dual union all
select 2002 a, 10 b from dual
)

-- 131.38125 결과값
-- 지정한 소수점 단위로 절삭한다.(131.3)
select trunc(decode(sum(b),0,0,null,0, avg(a/b)),1) result
from (
select 1001 a, 16 b from dual union all
select 2002 a, 10 b from dual
)

반응형

'ORACLE > SQL' 카테고리의 다른 글

oracle table count 오라클 테이블 건수 확인  (0) 2023.07.02
오라클 Count over  (0) 2018.07.06
동시성제어 SELECT FOR UPDATE #1  (0) 2013.03.01
Oracle EXISTS Versus IN  (0) 2010.06.18
NOT IN과 NOT EXISTS의 차이점  (0) 2010.04.02
Posted by [PineTree]