在运行此查询时,我遇到了错误"Divide by zero error encountered“。
> 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 %]这是一个经过编辑的现有存储过程,现在可以计算百分比,有什么快速修复方法吗?
发布于 2014-07-17 00:23:30
根据您使用的提供程序,尝试使用max/maxium语句。
/ MAX(SUM((CASE WHEN EML_DateViewed IS NOT NULL OR EML_DateClicked IS NOT NULL THEN 1 ELSE 0 END)), 1)这将使用您的和,如果它有一个值,如果它是零,除法将使用1代替。
发布于 2014-07-17 10:55:54
您没有显示分组标准,但是很明显,在整个组中,至少有一个组的日期设置为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(组上的所有空值),我已经设置了一个很大的数字,所以您得到的答案非常小。但相对于应用程序中的实际计数,这个值必须很大,因此可以根据需要进行调整。
https://stackoverflow.com/questions/24785585
复制相似问题