Search code examples
sqloracle9idivide-by-zero

How to avoid DIVIDE BY ZERO error in an SQL query


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

For a particular month, recd_qty is ZERO because of which I am getting DIVIDE BY ZERO error.

Is there any way to avoid DIVIDE BY ZERO error?

I there any way where in that particular month is ignored?


Solution

  • If you want to ignore such records you can use a subquery

    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;
    

    If you want to keep them and handle the division by zero issue, you can use decode or case

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