簡體   English   中英

即使將除法器設置為NOT NULL也會遇到除以零的錯誤

[英]Divide by zero error encountered even when divider is set as NOT NULL

我在運行此查詢時遇到錯誤“遇到零除錯誤”。

>    SUM(CASE WHEN EML_DateSent IS NOT NULL THEN 1 ELSE 0 END) AS [Sends],
        (SUM(CASE WHEN EML_DateViewed IS NOT NULL OR EML_DateClicked IS NOT NULL THEN 1 ELSE 0 END)) * 100 / SUM((CASE WHEN EML_Datesent IS NOT NULL THEN 1 ELSE 0 END)) AS [Views %],
        (SUM(CASE WHEN EML_DateClicked IS NOT NULL THEN 1 ELSE 0 END)) * 100 / SUM((CASE WHEN EML_DateViewed IS NOT NULL OR EML_DateClicked IS NOT NULL THEN 1 ELSE 0 END)) AS [Clicks %]

它是經過編輯的現有存儲過程,現在可以計算百分比,是否有快速解決方案?

根據您使用的提供程序嘗試使用max / maxium語句。

/ MAX(SUM((CASE WHEN EML_DateViewed IS NOT NULL OR EML_DateClicked IS NOT NULL THEN 1 ELSE 0 END)), 1)

如果有一個值,它將使用您的總和;如果為零,則除法將使用1。

您沒有顯示分組條件,但是很明顯,在整個組中,至少有一個組的日期之一設置為NULL。 首先,您不必將所有邏輯都放在sum函數中。 count函數執行此操作,對所有非null值進行計數,而忽略null值。 不能同時檢查兩個日期的地方,但是可以通過簡單的coalesce來解決。 您需要計算一個日期或另一個日期或兩者都不為空的位置。 在那里,您可以玩一些小把戲:

select count(EMS_DateSent) AS Sends,
    count(coalesce(EMS_DateViewed, EMS_DateClicked)) * 100
        / case count(EMS_Datesent) 
              when 0 then 1000000
              else count(EMS_Datesent)
          end as "Views %",
    count(EMS_DateClicked) * 100
        / case count(coalesce(EMS_DateViewed, EMS_DateClicked))
              when 0 then 1000000
              else count(coalesce(EMS_DateViewed, EMS_DateClicked))
          end AS "Clicks %"
from EML
group by whatever;

如果除數為0(組中的所有null),那么我設置為一個大數,因此您得到的答案很小。 但這相對於應用程序中的實際計數必須很大,因此請根據需要進行調整。

暫無
暫無

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

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