在sql中计算销售百分比时出现除零错误

eivnm1vs  于 2021-08-09  发布在  Java
关注(0)|答案(5)|浏览(625)

我不断收到以下错误消息:
msg 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'

谢谢

euoag5mw

euoag5mw1#

在空测试中 Package 一个除法并不能消除被0除的错误。相反,您需要检查被除的值是否为0,并返回不同的值。你可以使用 IIF :

IIF(a.ORIGINALRETAIL = 0, 0, 100.0 * (a.ORIGINALRETAIL-a.RetOne) / a.ORIGINALRETAIL)
bgtovc5b

bgtovc5b2#

你可以用 coalesce 或者 isnull . mysql使用 ifnull ```
case
when a.DiscountReasonCode = 'RL' then (a.ORIGINALRETAIL-a.RetOne) /
NULLIF(a.ORIGINALRETAIL, 0) * 100
end as [PctSB]

xkrw2x1b

xkrw2x1b3#

msg 8134,级别16,状态1,行1除以零遇到错误。
此错误表明分母为0,因此可以使用大小写表达式将其更改为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]

ojsjcaue

ojsjcaue4#

我想你看到的那些帖子 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

只是有点罗嗦

pn9klfpd

pn9klfpd5#

你想要的逻辑是由 NULLIF() :

(a.ORIGINALRETAIL - a.RetOne) * 100.0 / NULLIF(a.ORIGINALRETAIL, 0)) * 100) as [PctSB]

使用标准sql函数 NULLIF() 是做你想做的事情的最简单的方法,我建议你这样写逻辑。它取代了任何 0 价值 NULL --从而避免被零除。

相关问题