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