如何避免SQL查询中的DIVIDE BY ZERO错误

时间:2011-02-17 10:38:56

标签: sql oracle9i divide-by-zero

SELECT  YEAR, period, round((1- sum(rej_qty) / sum(recd_qty))*100, 0)   
 FROM   TAB_A
 WHERE  sid = '200'
 AND    sdid IN ('4750')
 AND
(
       (
          YEAR ='2011'
       AND    period IN('01_JAN')
       )
OR
       (
          YEAR = '2010'
       AND    period IN('02_FEB','03_MAR','04_APR','05_MAY','06_JUN','07_JUL','08_AUG','09_SEP','10_OCT','11_NOV','12_DEC')
       )
)
group by year, period

对于某个特定月份,recd_qty为ZERO,因为我得到DIVIDE BY ZERO错误。

有没有办法避免DIVIDE BY ZERO错误?

我有什么方法可以忽略那个特定的月份?

4 个答案:

答案 0 :(得分:20)

答案 1 :(得分:9)

如果要忽略此类记录,可以使用子查询

SELECT  YEAR, period, round((1- rej_sum / recd_sum)*100, 0) FROM
(
  SELECT YEAR, sum(rej_qty) rej_sum, sum(recd_qty) recd_sum
  FROM   TAB_A
  WHERE  sid = '200'
  AND    sdid IN ('4750')
  AND
  (
       (
          YEAR ='2011'
       AND    period IN('01_JAN')
       )
  OR
  (
      YEAR = '2010'
       AND    period IN ('02_FEB','03_MAR','04_APR','05_MAY','06_JUN','07_JUL','08_AUG','09_SEP','10_OCT','11_NOV','12_DEC')
       )
  )
  group by year, period
)
WHERE recd_sum <> 0;

如果你想保留它们并通过零问题处理除法,你可以使用解码或案例

SELECT  YEAR, period, DECODE(recd_qty, 0, NULL, round((1- sum(rej_qty) / sum(recd_qty))*100, 0)) 

答案 2 :(得分:3)

round(ISNULL(
((1- sum(rej_qty)) / NULLIF( (sum(recd_qty))*100), 0 )),
0
),0)

如果使用NULLIF替换除法以在除以零时设置NULL,则使用ISNULL将NULL替换为0 - 或者实际上是您想要的值。

答案 3 :(得分:0)

case sum(recd_qty)<> 0 THEN round((1- sum(rej_qty)/ sum(recd_qty))* 100,0)ELSE 0 END