在 SQL 中计算销售百分比时除零错误
Posted
技术标签:
【中文标题】在 SQL 中计算销售百分比时除零错误【英文标题】:Divide Zero error when calculating Sales % in SQL 【发布时间】:2020-06-28 23:11:16 【问题描述】:我不断收到以下错误消息:
消息 8134,级别 16,状态 1,行 1 遇到除以零错误。
我看过一些关于使用 IFNULL
的帖子,我已经尝试过了。
例如:
,Case when a.DiscountReasonCode = 'RL' then IFNULL(((a.ORIGINALRETAIL-a.RetOne) / (a.ORIGINALRETAIL) * 100),0) end as [PctSB]
但这会返回以下错误:
'IFNULL' 不是可识别的内置函数名。
我正在做的是尝试计算正确的销售百分比,然后查找并将其与表中已有的内容进行比较,以找出错误或丢失的销售百分比。
我不确定我哪里出错了,但我们将不胜感激。
SELECT
a.packnum
,a.description
,a.CatID
,a.PctSavings
,Case when a.DiscountReasonCode = 'RL' then (a.ORIGINALRETAIL-a.RetOne) / (a.ORIGINALRETAIL) * 100
end as [PctSB]
FROM PIC704Current a Join CatalogInfo b ON (a.CatID = b.Catalog) and (a.Year = b.MailYear)
WHERE
b.MediaId in('CAT Catalog','SCAT Sale Catalog','SSTF Sale Statement Stuff','STUF Statement
Stuffer','PKG Package Insert','SPKG Sale Pkg Insert')
and a.DiscountReasonCode = 'RL'
and a.year >='2020'
and (Case when a.PctSavings <> (a.ORIGINALRETAIL-a.RetOne)/a.ORIGINALRETAIL*100 then 'False' else
'True' END) = 'False'
谢谢
【问题讨论】:
data-flair.training/blogs/sql-null-functions 【参考方案1】:在空测试中包装除法不会消除除以 0 错误。相反,您需要检查被除以的值是否为 0 并返回不同的值。您可以使用IIF
:
IIF(a.ORIGINALRETAIL = 0, 0, 100.0 * (a.ORIGINALRETAIL-a.RetOne) / a.ORIGINALRETAIL)
【讨论】:
感谢大家,每一个都是一个决议。老实说,我没有想到的一件事。我完全忘记了原始零售可能被设置为零,因此它不能被整除,而且直到我看到它才注册给我。非常感谢大家的帮助!!!!!! @Deke 很高兴能帮上忙。【参考方案2】:您可以使用 coalesce
或 isnull
。 mysql 使用ifnull
case
when a.DiscountReasonCode = 'RL' then (a.ORIGINALRETAIL-a.RetOne) /
NULLIF(a.ORIGINALRETAIL, 0) * 100
end as [PctSB]
【讨论】:
感谢您的回复!我尝试了 Coalesce 和 isnull 但仍然得到除以零错误。我还禁用了 where 语句以确保。但同样的问题。 @Deke 立即尝试。我已经更新了我的答案。它应该可以工作。【参考方案3】:消息 8134,级别 16,状态 1,行 1 遇到除以零错误。
此错误表明您的分母为 0,因此您可以使用 case 表达式将其更改为 NULL。
'IFNULL' 不是可识别的内置函数名。
在 SQL Server 中,您可以使用ISNULL
或Coalesce
CASE WHEN a.DiscountReasonCode = 'RL'
THEN ISNULL(((a.ORIGINALRETAIL-a.RetOne)/(CASE WHEN a.ORIGINALRETAIL = 0
THEN NULL
ELSE a.ORIGINALRETAIL
END) * 100),0)
END AS [PctSB]
【讨论】:
【参考方案4】:我认为你看到的提到IFNULL
的帖子实际上可能一直在提到NULLIF
,你只是记错了。避免 sqlserver 中出现 DIV/0 错误的典型技巧之一:
some_number / NULLIF(other_number_maybe_zero, 0)
如果除数为0,则转换为null,表示结果为null而不是错误
在标准 SQL 中你也可以这样做:
some_number / CASE WHEN other_number_maybe_zero = 0 THEN NULL ELSE other_number_maybe_zero END
只是有点啰嗦
【讨论】:
【参考方案5】:你要的逻辑由NULLIF()
提供:
(a.ORIGINALRETAIL - a.RetOne) * 100.0 / NULLIF(a.ORIGINALRETAIL, 0)) * 100) as [PctSB]
使用标准SQL函数NULLIF()
是做你想做的最简单的方法,我建议你这样写逻辑。它用NULL
替换任何0
值——从而避免被零除。
【讨论】:
以上是关于在 SQL 中计算销售百分比时除零错误的主要内容,如果未能解决你的问题,请参考以下文章
mssql sqlserver避免sql脚本中出现除零错误的方法分享