运行脚本时,我在 SQL 中得到“除以零”
Posted
技术标签:
【中文标题】运行脚本时,我在 SQL 中得到“除以零”【英文标题】:When running a script I get "divide by zero” in SQL 【发布时间】:2019-05-24 11:14:07 【问题描述】:我正在尝试在 SQL 中运行一个脚本,我在其中进行划分,但我收到错误“遇到除以零错误”
我尝试添加在我阅读的旧帖子中建议的 NULLIF,但这并没有帮助。
SELECT SUM([SE Gross]) AS [Donors Gross],
ROUND((SUM([Cancelled]) * 100) / NULLIF(SUM([SE Gross]), 2), 0),
SUM([Venue Cost]),
SUM([Accom/Expenses]),
ROUND(SUM([SE Gross]) / NULLIF(SUM([fundraising days]), 2), 0) AS Column1,
ROUND(SUM([Venue Cost]) / NULLIF(SUM([SE Gross]), 2), 0) AS Column2,
ROUND(SUM([Venue Cost] + [Accom/Expenses]) / NULLIF(SUM([SE Gross]), 2), 0) AS column3,
ROUND(SUM([Venue Cost] + [Accom/Expenses]) / NULLIF(SUM([donor net COUNT]), 2), 0) AS column4
FROM dbo.TEST1;
我目前得到的结果是:遇到除以零错误。
【问题讨论】:
我想你可能想要的是 ISNULL,而不是 NULLIF。您是否真的去阅读documentation 以了解该功能的作用?不要在不了解其基本思想的情况下盲目地从互联网上复制代码。由于现在搜索引擎如此强大,文档和示例如此丰富,通常没有理由不做至少一点简单的研究,只需几秒钟 存在除法错误,因此(作为调试步骤)将该除法的两个组件拆分为单独的列并检查 0 附言。如果您的字段中的数据实际上只是 0,那么 ISNULL 也不会帮助您......也许 CASE 语句可能会更好。您没有向我们展示任何示例数据,因此我们无法准确确定发生了什么情况 看起来您系统地将参数交换为ROUND
和 NULLIF
。您当前正在使用NULLIF(SUM([SE Gross]), 2)
,如果SUM([SE Gross])
正好等于2,这会将结果转换为NULL
。您想要NULLIF(SUM([SE Gross]), 0)
(大概是四舍五入)。
@ADyson 我确定操作不想使用isnull
。你明白nullif
应该在这里实现什么吗?没有必要如此咄咄逼人地告诫 op(尤其是当你显然不明白他们想要达到的目标时)。
【参考方案1】:
如果它等于 2,您正在尝试转换为 NULL
。检查此部分:NULLIF(SUM([SE Gross]), 2)
,您必须在以下内容中将 2
更改为 0
:
SELECT SUM([SE Gross]) AS [Donors Gross],
ROUND((SUM([Cancelled]) * 100) / NULLIF(SUM([SE Gross]), 0), 0),
SUM([Venue Cost]),
SUM([Accom/Expenses]),
ROUND(SUM([SE Gross]) / NULLIF(SUM([fundraising days]), 0), 0) AS Column1,
ROUND(SUM([Venue Cost]) / NULLIF(SUM([SE Gross]), 0), 0) AS Column2,
ROUND(SUM([Venue Cost] + [Accom/Expenses]) / NULLIF(SUM([SE Gross]), 0), 0) AS column3,
ROUND(SUM([Venue Cost] + [Accom/Expenses]) / NULLIF(SUM([donor net COUNT]), 0), 0) AS column4
FROM dbo.TEST1;
另外,如果divider = 0,您可以使用CASE
语句来避免整个条目为空,如下所示:
CASE WHEN NULLIF(SUM([SE Gross]), 0) = 0 THEN 1 ELSE NULLIF(SUM([SE Gross]), 0) END
或者在下面将ISNULL
与NULLIF
结合起来:
ISNULL(NULLIF(SUM([SE Gross]), 0), 1)
我的猜测是你想四舍五入到小数点后两位,所以在这种情况下,它应该是这样的:
ROUND((SUM([Cancelled]) * 100) / ISNULL(NULLIF(SUM([SE Gross]), 0), 1), 2)
【讨论】:
非常感谢您的理解和帮助:) @StanislovasKalašnikovas 。 . .好收获!【参考方案2】:只是为了纠正我之前的回答 - 应该使用 CASE:
SELECT SUM([SE Gross]) AS [Donors Gross],
CASE WHEN SUM([SE Gross]<>0 THEN ROUND((SUM([Cancelled]) * 100) / NULLIF(SUM([SE Gross]), 2), 0) ELSE 0 END,
SUM([Venue Cost]),
SUM([Accom/Expenses]),
CASE WHEN SUM([fundraising days] <> 0 THEN ROUND(SUM([SE Gross]) / NULLIF(SUM([fundraising days]), 2), 0) ELSE 0 END AS Column1,
CASE WHEN SUM([SE Gross] <> 0 THEN ROUND(SUM([Venue Cost]) / NULLIF(SUM([SE Gross]), 2), 0) ELSE 0 END AS Column2,
CASE WHEN SUM([SE Gross] <> 0 THEN ROUND(SUM([Venue Cost] + [Accom/Expenses]) / NULLIF(SUM([SE Gross]), 2), 0) ELSE 0 END AS column3,
CASE WHEN SUM([donor net COUNT] <> 0 THEN ROUND(SUM([Venue Cost] + [Accom/Expenses]) / NULLIF(SUM([donor net COUNT]), 2), 0) ELSE 0 END AS column4
FROM dbo.TEST1;
现在应该可以了 :)
如果需要,您还可以删除 NULLIF(我留下了它们,因为我不知道您是否可能需要它们用于不同的目的)
【讨论】:
以上是关于运行脚本时,我在 SQL 中得到“除以零”的主要内容,如果未能解决你的问题,请参考以下文章