Pytanie w sprawie sql-server – Podział przez zero błędów podczas próby podzielenia danych

-2

Oto mój kod:

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)  

Wszystko działa doskonale z kodem, z wyjątkiem:

SUM(GRAND_TOTAL) / SUM(NUM_PEOPLE_PARTY) AS CASHPERCUSTOMER

część. Jeśli biorę ten wiersz, wszystko działa idealnie, jeśli go wrzucę, pojawia się następujący błąd:

Wiadomość: Nie można pobrać danych.
SELECT CASHIER_ID AS SERVER, ... reszta zapytania powyżej ...

Ślad stosu:
... nieistotny ślad stosu ...

Wiadomość:Dzieląc przez zero pojawił się bład.

Ślad stosu:
... nieistotny ślad stosu ...

To jest SQL wewnątrz systemu punktów sprzedaży w restauracji (POS), który używa SQL Server. Jakieś pomysły, dlaczego tak się dzieje?

Ponieważ próbujesz podzielić przez 0? Aaron Bertrand

Twoja odpowiedź

2   odpowiedź
3

Sprawdź podział na 0 przed podziałem:

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

Lub uzyskaj ten sam wynik, używającNULLIF:

SELECT
    ...,
    CASE SUM(GRAND_TOTAL) / NULLIF(SUM(NUM_PEOPLE_PARTY), 0) AS CASHPERCUSTOMER,
    ... 
Tak. Przepraszam za zamieszanie. Masz głos. Mark M
Twoja pierwsza odpowiedź wygląda dobrze, ale twoja druga odpowiedź NIE jest taka sama i nie rozwiąże problemu, ponieważ zastępuje mianownik NULL mianownikiem zero. Faktycznie dzielenie przez null nie jest problemem, ponieważ ten podział miałby wartość null. Mark M
@MarkM: Czy mylisz NULLIF z IFNULL? Mark Byers
To działało doskonale (pierwsza sugestia), dziękuję bardzo za poświęcenie czasu! tmparisi
4

Musisz uruchomić zapytanie w ten sposób i powiedzieć nam, czy są jakieś wyniki:

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;

Jeśli są wyniki, to twoje zapytanie musi je spełnić. Na przykład:

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

Ale powinieneś dowiedzieć się, dlaczego są wyniki z 0, ponieważ nie ma to większego sensu.

Powiązane pytania