首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使将divider设置为NOT NULL,也会遇到除零错误

即使将divider设置为NOT NULL,也会遇到除零错误
EN

Stack Overflow用户
提问于 2014-07-17 00:08:30
回答 2查看 347关注 0票数 0

在运行此查询时,我遇到了错误"Divide by zero error encountered“。

代码语言:javascript
复制
>    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 %]

这是一个经过编辑的现有存储过程,现在可以计算百分比,有什么快速修复方法吗?

EN

回答 2

Stack Overflow用户

发布于 2014-07-17 00:23:30

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

代码语言:javascript
复制
/ MAX(SUM((CASE WHEN EML_DateViewed IS NOT NULL OR EML_DateClicked IS NOT NULL THEN 1 ELSE 0 END)), 1)

这将使用您的和,如果它有一个值,如果它是零,除法将使用1代替。

票数 0
EN

Stack Overflow用户

发布于 2014-07-17 10:55:54

您没有显示分组标准,但是很明显,在整个组中,至少有一个组的日期设置为NULL。首先,您不必将所有逻辑都放在一个sum函数中。count函数执行此操作,计算所有not null值,忽略null值。不起作用的地方是检查两个日期,但这可以通过一个简单的coalesce来解决。您需要一个日期或另一个日期或两个日期都不为空的计数。在这里你可以玩一个小把戏:

代码语言:javascript
复制
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(组上的所有空值),我已经设置了一个很大的数字,所以您得到的答案非常小。但相对于应用程序中的实际计数,这个值必须很大,因此可以根据需要进行调整。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24785585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档