在 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】:

您可以使用 coalesceisnullmysql 使用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脚本中出现除零错误的方法分享

sql 使用NULLIF避免SQL除零错误

ZeroDivisionError:计算标准偏差时浮点除零

jenkins构建中的除零错误

LLVM 之 Clang 静态分析器篇:程序缺陷诊断——除零错误

显示除零之外的最小值以及每年的相邻列值+ Python 3+,数据框