Divide by zero error encountered


Usando NULLIF e COALESCE Algumas vezes podemos nos deparar com a seguinte mensagem “Divide by zero error encountered” numa consulta SQL onde por exemplo temos uma divisão Num caso como esse se o conteúdo do campo D1_QUANT for zero, ocorrerá um erro pois não se divida algo por zero, para evitar um erro indesejável, existe uma função SQL chamada NULLIF(expressao1, expressao2) se o resultado da primeira expressão for igual a segunda, o resultado será trocado por NULL. A consulta ficaria assim:

SELECT F1_FILIAL, 
       F1_TIPO,   
       F1_DOC,    
       F1_SERIE,  
       D1_DTDIGIT,
       D1_COD, 
       D1_LOCAL,
((D1_CUSTO/ NULLIF(D1_QUANT ,0))- B9_CM1) DIFB9
FROM   SF1010 SF1 ,SD1010 SD1, SB9010 SB9
WHERE  SF1.D_E_L_E_T_ <> '*' 
  AND  SD1.D_E_L_E_T_ <> '*' 
  AND  SB9.D_E_L_E_T_ <> '*' 
  AND  F1_FILIAL = '01' 
  AND  D1_FILIAL = '01' 
  AND  B9_FILIAL = '01' 
  AND  B1_FILIAL = '01' 
… (resto da query)
E para o resulta não apresentar o conteúdo NULL Use a função COALESCE Ficaria assim: COALESCE(D1_CUSTO/ NULLIF(D1_QUANT ,0)- B9_CM1,0) DIFB9 Existem outras formas para tratar este erro que é por exemplo usando a função CASE A consulta ficaria assim:
SELECT F1_FILIAL, 
       F1_TIPO,   
       F1_DOC,    
       F1_SERIE,  
       D1_DTDIGIT,
       D1_COD, 
       D1_LOCAL,
CASE WHEN D1_QUANT > 0 THEN ((D1_CUSTO/D1_QUANT)- B9_CM1) ELSE 0 END DIFB9
FROM   SF1010 SF1 ,SD1010 SD1, SB9010 SB9
WHERE  SF1.D_E_L_E_T_ <> '*' 
  AND  SD1.D_E_L_E_T_ <> '*' 
  AND  SB9.D_E_L_E_T_ <> '*' 
  AND  F1_FILIAL = '01' 
  AND  D1_FILIAL = '01' 
  AND  B9_FILIAL = '01' 
  AND  B1_FILIAL = '01' 
… (resto da query)
Caso o resultado do campo D1_QUANT for maior que zero, então faça o calculo, senão coloque zero. Comparando as duas formas apresentadas acima COALESCE(D1_CUSTO/ NULLIF(D1_QUANT ,0)- B9_CM1,0) DIFB9 ou CASE WHEN D1_QUANT > 0 THEN ((D1_CUSTO/D1_QUANT)- B9_CM1) ELSE 0 END DIFB9