Pregunta sobre sql-server – Error división por cero al tratar de dividir datos

-2

Aquí está mi código:

SELECT CASHIER_ID AS SERVER, CONVERT(VARCHAR(10),[DATETIME],111) AS DATE, 
  SUM(GRAND_TOTAL) AS TOTAL_SALES, 
  SUM(NUM_PEOPLE_PARTY) AS NUMBER_SERVED,  
  SUM(GRAND_TOTAL) / SUM(NUM_PEOPLE_PARTY) AS CASHPERCUSTOMER 
FROM INVOICE_TOTALS 
WHERE [DATETIME] >= '2012-06-01' 
GROUP BY CASHIER_ID, CONVERT(VARCHAR(10),[DATETIME],111)  

Todo funciona perfectamente con el código, excepto por:

SUM(GRAND_TOTAL) / SUM(NUM_PEOPLE_PARTY) AS CASHPERCUSTOMER

parte. Si saco esta línea, entonces todo funciona a la perfección. Si la coloco, recibo el siguiente error:

Mensaje: No se pudo recuperar.
SELECCIONA CASHIER_ID COMO SERVIDOR, ... resto de consulta arriba ...

Traza de la pila:
... traza de pila irrelevante ...

Mensaje:Ocurrió un error de división por cero.

Traza de la pila:
... traza de pila irrelevante ...

Esto es SQL dentro de un sistema de punto de venta (POS) de restaurante que usa SQL Server. ¿Alguna idea de por qué esto puede estar ocurriendo?

¿Porque estás tratando de dividir por 0? Aaron Bertrand

Tu respuesta

2   la respuesta
3

Compruebe si hay 0 antes de dividir:

SELECT
    ...,
    CASE WHEN SUM(NUM_PEOPLE_PARTY) = 0
         THEN NULL
         ELSE SUM(GRAND_TOTAL) / SUM(NUM_PEOPLE_PARTY) END AS CASHPERCUSTOMER,
    ... 

O consigue el mismo resultado usandoNULLIF:

SELECT
    ...,
    CASE SUM(GRAND_TOTAL) / NULLIF(SUM(NUM_PEOPLE_PARTY), 0) AS CASHPERCUSTOMER,
    ... 
@MarkM: ¿Confunde NULLIF con IFNULL? Mark Byers
Esto funcionó perfectamente (la primera sugerencia), muchas gracias por tomarse el tiempo. tmparisi
Su primera respuesta se ve bien, pero su segunda respuesta NO es la misma y no solucionará el problema, ya que reemplaza un denominador NULO con un denominador de cero. En realidad, dividir por nulo no es un problema porque esa división evaluaría a nulo. Mark M
Gracias Aaron, pero no tengo acceso para cambiar los problemas de la base de datos. Aparte de eso, no entiende nuestra operación y pensar que entiende nuestras operaciones comerciales desde un script SQL es una tontería. Sin embargo, para que pueda sentirse aliviado, hay ceros porque algunas empresas ofrecen un servicio de transferencia ... ¿es posible que haya participado? Pero gracias por su respuesta. tmparisi
4

s:

SELECT CASHIER_ID AS SERVER, 
  CONVERT(VARCHAR(10),[DATETIME],111) AS DATE, 
  SUM(GRAND_TOTAL) AS TOTAL_SALES,  
  SUM(NUM_PEOPLE_PARTY) AS NUMBER_SERVED
FROM INVOICE_TOTALS 
WHERE [DATETIME] >= '2012-06-01' 
GROUP BY CASHIER_ID, CONVERT(VARCHAR(10),[DATETIME],111) 
HAVING SUM(NUM_PEOPLE_PARTY) = 0;

Si hay resultados, entonces claramente su consulta necesita atenderlos. Por ejemplo:

SELECT SERVER, [DATE], TOTAL_SALES, NUMBER_SERVED,
  CASHPERCUSTOMER = TOTAL_SALES / NULLIF(NUMBER_SERVED, 0)
FROM
(
  SELECT CASHIER_ID AS SERVER, 
    CONVERT(VARCHAR(10),[DATETIME],111) AS DATE, 
    SUM(GRAND_TOTAL) AS TOTAL_SALES,  
    SUM(NUM_PEOPLE_PARTY) AS NUMBER_SERVED
  FROM INVOICE_TOTALS 
  WHERE [DATETIME] >= '2012-06-01' 
  GROUP BY CASHIER_ID, CONVERT(VARCHAR(10),[DATETIME],111) 
);

Pero debes averiguar por qué hay resultados con 0 ya que eso no tiene mucho sentido.

Preguntas relacionadas