簡體   English   中英

在 SQL 中計算銷售額百分比時除零錯誤

[英]Divide Zero error when calculating Sales % in SQL

我不斷收到以下錯誤消息:

消息 8134,級別 16,State 1,第 1 行遇到除以零錯誤。

我看過一些關於使用IFNULL的帖子,我已經嘗試過。 例如:

,Case when a.DiscountReasonCode = 'RL' then IFNULL(((a.ORIGINALRETAIL-a.RetOne) / (a.ORIGINALRETAIL) * 100),0) end as [PctSB]

但這會返回以下錯誤:

'IFNULL' 不是可識別的內置 function 名稱。

我正在做的是嘗試計算正確的銷售百分比,然后找到並將其與表中已有的內容進行比較,以查找錯誤或丟失的銷售百分比。

我不確定我哪里出錯了,但任何幫助將不勝感激。

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'

謝謝

您可以使用coalesceisnull MySQL 使用ifnull

case 
  when a.DiscountReasonCode = 'RL' then (a.ORIGINALRETAIL-a.RetOne) / 
  NULLIF(a.ORIGINALRETAIL, 0) * 100 
end as [PctSB]

消息 8134,級別 16,State 1,第 1 行遇到除以零錯誤。

此錯誤表明您的分母為 0,因此您可以使用 case 表達式將其更改為 NULL。

'IFNULL' 不是可識別的內置 function 名稱。

在 SQL 服務器中,可以使用ISNULLCoalesce

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]

在 null 測試中包裝除法不會消除除以 0 錯誤。 相反,您需要檢查被除以的值是否為 0 並返回不同的值。 您可以使用IIF執行此操作:

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

我認為您看到的提到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

只是有點啰嗦

您想要的邏輯由NULLIF()提供:

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

使用標准 SQL function NULLIF()是做你想做的最簡單的方法,我建議你這樣寫邏輯。 它用NULL替換任何0值——從而避免被零除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM