运行脚本时,我在 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 语句可能会更好。您没有向我们展示任何示例数据,因此我们无法准确确定发生了什么情况 看起来您系统地将参数交换为 ROUNDNULLIF。您当前正在使用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

或者在下面将ISNULLNULLIF 结合起来:

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 中得到“除以零”的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL为啥除以零不会在order by子句中产生错误

除以零 - c 编程

控制休眠sql脚本运行

当我尝试 DIV 时,我得到“除以零”但它不是零 [重复]

R中的SQL脚本仅提供有限数量的观察

从 SQLPlus 运行 SQL 脚本失败时如何查看错误?