【问题标题】:Divide by zero error encountered even when divider is set as NOT NULL即使将除数设置为 NOT NULL,也会遇到除以零错误
【发布时间】:2014-09-07 06:21:31
【问题描述】:

我在运行此查询时遇到错误“遇到除以零错误”。

>    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 %]

它是一个已编辑的现有存储过程,现在可以计算百分比,有什么快速解决方法吗?

【问题讨论】:

  • 您遇到此错误是因为它可以被评估为零! ` ELSE 0 END` 在您使用的两种情况下。
  • 很明显,这个片段可能会被零除
  • 从分母中删除ELSE 0

标签: sql divide-by-zero


【解决方案1】:

根据您使用的提供程序尝试使用 max/maxium 语句。

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

如果它有一个值,这将使用你的总和,如果它是零,则除法将使用 1。

【讨论】:

    【解决方案2】:

    您没有显示分组标准,但很明显至少有一个组在整个组中将日期之一设置为 NULL。首先,您不必将所有这些逻辑都放在sum 函数中。 count 函数执行此操作,计算所有 not 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(组中的所有空值),我已设置为一个很大的数字,因此您得到的答案非常小。但这相对于您应用程序中的实际计数必须很大,因此请根据需要进行调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2021-08-05
      • 1970-01-01
      • 2019-08-23
      • 2021-05-07
      • 1970-01-01
      相关资源
      最近更新 更多