2011-02-17 151 views
9
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 

Para un mes en particular, recd_qty es CERO porque me da un error DIVIDIR POR CERO.Cómo evitar el error DIVIDIR POR CERO en una consulta SQL

¿Hay alguna manera de evitar el error DIVIDE BY ZERO?

¿Hay alguna manera en que en ese mes en particular se ignora?

Respuesta

9

Si desea ignorar este tipo de registros se puede utilizar una subconsulta

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; 

Si desea mantenerlos y manejar la división por número cero, puede utilizar decodificación o el caso

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

La cláusula 'WHERE' no resolvería el problema ya que está sumando' recd_qty's antes de dividir. – Tim

+0

@Tim Gracias, he cambiado el SQL para una subconsulta –

+0

@Kenny Eso es lo que ... puede no ser exacto :) –

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

Si reemplaza su división, usando NULLIF para establecer un valor NULL cuando hay división por cero, entonces un ISNULL a reemplace el NULL con un 0 - o de hecho el valor que desee.

Cuestiones relacionadas