Pergunta sobre sql-server – Divisão por erro zero ao tentar dividir dados

-2

Aqui está o meu 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)  

Tudo funciona perfeitamente com o código, exceto pelo:

SUM(GRAND_TOTAL) / SUM(NUM_PEOPLE_PARTY) AS CASHPERCUSTOMER

parte. Se eu tirar essa linha então tudo funciona perfeito, se eu colocar isso recebo o seguinte erro:

Mensagem: não foi possível recuperar a tabela de dados.
SELECT CASHIER_ID AS SERVER, ... rest of query above ...

Rastreamento de pilha:
... rastreamento de pilha irrelevante ...

Mensagem:Divisão por zero erro encontrado.

Rastreamento de pilha:
... rastreamento de pilha irrelevante ...

Isso é o SQL dentro de um sistema de ponto de venda de restaurante (POS) que usa o SQL Server. Alguma idéia de por que isso pode estar ocorrendo?

Porque você está tentando dividir por 0? Aaron Bertrand

Sua resposta

2   a resposta
4

Você precisará executar a consulta dessa maneira e nos informar se há algum resultado:

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;

Se houver resultados, é claro que a sua consulta precisa atendê-los. Por exemplo:

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) 
);

Mas você deve descobrir por que existem resultados com 0s, já que isso não faz muito sentido.

3

Verifique por 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,
    ... 

Ou obtenha o mesmo resultado usandoNULLIF:

SELECT
    ...,
    CASE SUM(GRAND_TOTAL) / NULLIF(SUM(NUM_PEOPLE_PARTY), 0) AS CASHPERCUSTOMER,
    ... 
@MarkM: Você está confundindo NULLIF com IFNULL? Mark Byers
Isso funcionou perfeitamente (a primeira sugestão), muito obrigado por tomar o tempo! tmparisi
Sim. Desculpe pela confusão. Tem um upvote. Mark M
Obrigado Aaron, mas não tenho acesso para alterar os problemas do banco de dados. Além disso, você não entende nossa operação e acha que entende que nossas operações de negócios de um script SQL são tolas. No entanto, para que você possa se sentir aliviado, há zeros porque algumas empresas oferecem serviço de carryout ... possivelmente você participou? Mas obrigado pela sua resposta. tmparisi

Perguntas relacionadas