Вопрос по sql-server – Ошибка деления на ноль при попытке деления данных

-2

Вот мой код:

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)  

Все отлично работает с кодом, кроме:

SUM(GRAND_TOTAL) / SUM(NUM_PEOPLE_PARTY) AS CASHPERCUSTOMER

часть. Если я вычеркну эту строку, то все будет отлично работать. Если я вставлю ее, я получу следующую ошибку:

Message: Could not retrieve datatable.
SELECT CASHIER_ID AS SERVER, ...rest of query above...

Stack Trace:
...irrelevant stack trace...

Message: Divide by zero error encountered.

Stack Trace:
...irrelevant stack trace...

Это SQL внутри системы POS, которая использует SQL Server. Есть идеи, почему это может происходить?

Потому что вы пытаетесь разделить на 0? Aaron Bertrand

Ваш Ответ

2   ответа
4

есть ли какие-либо результаты:

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;

Если есть результаты, то, очевидно, ваш запрос должен учитывать их. Например:

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

Но вы должны выяснить, почему есть результаты с 0, поскольку это не имеет большого смысла.

3

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

Или получить тот же результат, используяNULLIF:

SELECT
    ...,
    CASE SUM(GRAND_TOTAL) / NULLIF(SUM(NUM_PEOPLE_PARTY), 0) AS CASHPERCUSTOMER,
    ... 
Ваш первый ответ выглядит хорошо, но ваш второй ответ НЕ тот же самый и не решит проблему, поскольку он заменяет знаменатель NULL на знаменатель ноль. На самом деле деление на ноль не является проблемой, потому что это деление будет иметь нулевое значение.
Спасибо, Аарон, но у меня нет доступа к решению проблем с базой данных. Кроме этого, вы не понимаете нашу работу и думать, что понимаете наши бизнес-операции из сценария SQL, глупо. Однако, так что вы можете почувствовать облегчение, есть нули, потому что некоторые компании предлагают услуги по проведению ... возможно, вы приняли участие? Но спасибо за ваш ответ. tmparisi
@MarkM: Вы путаете NULLIF с IFNULL?
@ tmparisi, так что, я так понимаю, вы не заинтересованы в устранении проблемы и определении, почему у вас бывают дни, когда у кассира были продажи, но они обслуживали ноль людей? Звучит как нечто большее, чем просто «подметать-под-ковер-по-запросу» проблема.
Да. Извините за путаницу. Имейте upvote.

Похожие вопросы