-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

部分。この行を削除すると、すべてが完全に機能します。これを入力すると、次のエラーが発生します。

メッセージ:データテーブルを取得できませんでした。
サーバーとしてCASHIER_IDを選択し、...上記のクエリの残りの部分...

スタックトレース:
...無関係なスタックトレース...

メッセージ:ゼロ除算エラーが発生しました。

スタックトレース:
...無関係なスタックトレース...

これは、SQL Serverを使用するレストランのPOS(point-of-sale)システム内のSQLです。なぜこれが起こっているのか考えはありますか?

4

2 に答える 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の結果があるのか​​を理解する必要があります。

于 2012-06-09T21:17:30.007 に答える
3

分割する前に0を確認してください。

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,
    ... 
于 2012-06-09T21:16:32.503 に答える