Sql server 尝试分割数据时出现零除错误
这是我的密码:Sql server 尝试分割数据时出现零除错误,sql-server,Sql Server,这是我的密码: 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 WHE
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
部分。如果我把这一行去掉,那么一切都很完美,如果我把它放进去,我会收到以下错误:
消息:无法检索数据表。
选择出纳ID作为服务器,…上面查询的其余部分…
堆栈跟踪:
…不相关的堆栈跟踪 消息:遇到被零除的错误。
堆栈跟踪:
…不相关的堆栈跟踪
这是使用SQL Server的餐厅销售点(POS)系统中的SQL。知道为什么会发生这种情况吗?除法前检查0:
SELECT
...,
CASE WHEN SUM(NUM_PEOPLE_PARTY) = 0
THEN NULL
ELSE SUM(GRAND_TOTAL) / SUM(NUM_PEOPLE_PARTY) END AS CASHPERCUSTOMER,
...
或者使用以下方法获得相同的结果:
您需要以这种方式运行查询,并告诉我们是否有任何结果:
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的结果,因为这没有多大意义。因为你试图除以0?你的第一个答案看起来不错,但你的第二个答案不一样,也无法解决问题,因为它用0的分母替换了空分母。实际上,除以null不是问题,因为该除法的计算结果为null。@MarkM:您是否将NULLIF与IFNULL混淆?这非常有效(第一个建议),非常感谢您花时间@tmparisi所以我认为你没有兴趣调试这个问题,也没有兴趣确定为什么你有这样的日子,收银员有销售,但没有为任何人提供服务?听起来不仅仅是“使用查询将其隐藏起来”的问题。谢谢Aaron,但我没有权限更改数据库问题。除此之外,您不了解我们的操作,认为您从SQL脚本了解我们的业务操作是愚蠢的。然而,你可以放心,因为有些公司提供结转服务,所以有零。。。可能你也参加了?但是谢谢你的回复。
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)
);