Sql 即使除法器设置为非空,也会遇到被零除的错误

Sql 即使除法器设置为非空,也会遇到被零除的错误,sql,divide-by-zero,Sql,Divide By Zero,我在运行此查询时遇到了错误除以零的错误 > 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 THE

我在运行此查询时遇到了错误除以零的错误

>    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。

您没有显示分组标准,但很明显,在整个组中,至少有一个组的一个日期设置为空。首先,你不必把所有的逻辑放在求和函数中。count函数会计算所有非空值,忽略空值。不起作用的地方是检查两个日期,但这可以通过简单的合并来解决。您需要一个计数,其中一个日期或另一个日期或两者都不为空。在那里你可以玩一个小把戏:

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,则组中的所有值都为空,我将其设置为一个大的数字,因此得到一个非常小的答案。但相对于应用程序中的实际计数,该值必须较大,因此请根据需要进行调整。

您有此错误,因为它可以计算为零ELSE 0 END`在您正在使用的两种情况下。很明显,此片段可能会受到除以零的影响。从分母中删除ELSE 0。