[英]Include zero figures in calculation without getting divide by zero errors
我正在尝试计算一个百分比的平均值,该平均值需要考虑零百分比。
我目前正在使用以下公式排除最终将最终为零的那些变量,但这使数字产生了偏差。
SET Average = (SELECT ROUND(AVG((CAST(Figure1 AS FLOAT)/CAST(Figure2 AS FLOAT))*100),2)
FROM [Schema].[Table] m
WHERE m.Figure1 > 0 and m.Figure2 > 0)
当我包括可能的从零开始的百分比时
SET Average = (SELECT ROUND(AVG((CAST(Figure1 AS FLOAT)/CAST(Figure2 AS FLOAT))*100),2)
FROM [Schema].[Table] m)
我显然收到以下错误;
除以零时遇到的错误。 该语句已终止。
如何更改此值以包括从零开始的百分比而没有错误?
这个问题将被零除进行-因此,只有figure2
是相关的也就是红利。
使用case
语句为该特定案例设置静态值(我选择了0
):
SET Average = (SELECT ROUND(AVG(case when Figure2 = 0
then 0
else CAST(Figure1 AS FLOAT) / CAST(Figure2 AS FLOAT)
end * 100)
,2)
FROM [Schema].[Table] m)
防止被零除的一种好方法是使用NULLIF函数,如下所示:
SET Average = (SELECT ROUND(AVG((CAST(Figure1 AS FLOAT)/NULLIF(CAST(Figure2 AS FLOAT), 0))*100),2)
FROM [Schema].[Table] m)
使用NULLIF方法,对于图2为0的行,将返回NULL值。AVG函数将忽略NULL值。 因此,请仔细考虑这是否是您要使用的解决方案(因为结果可能与您期望的有所不同)。
好吧,真正的问题是被零除会产生不确定的结果,因此它们不应成为任何计算的一部分。
如果您决定将它们考虑在内,则必须给它们一些标称值。 假设您要使用“零”作为标称值:您可以执行以下操作:
SELECT @average =
AVG( CASE
WHEN COALESCE(CAST(figure2 AS Float), 0) = 0 THEN 0.0
ELSE COALESCE(CAST figure1 AS Float), 0) / CAST(figure2 AS Float)
END
)
FROM MyTable
WHERE Blah Blah Blah
而答案
SET Average = (SELECT ROUND(AVG(case when Figure2 = 0
then 0
else CAST(Figure1 AS FLOAT) / CAST(Figure2 AS FLOAT)
end * 100)
,2)
FROM [Schema].[Table] m)
如果您希望将Figure2为零的记录平均为零,那将是很好的选择,但我个人根本不希望使用它们,而是使用
SET Average = (SELECT ROUND(AVG(CAST(Figure1 AS FLOAT) / CAST(Figure2 AS FLOAT)
* 100)
,2)
FROM [Schema].[Table] m where Figure2 <> 0 and Figure2 is not null)
或这是一种奖励积分的情况,您实际上在0点中有4点。 然后,我将执行以下操作。 仍要考虑到Figure2的结果中是否确实包含全零。
SET Average = ((SELECT CASE WHEN (SUM(CAST(Figure2 AS FLOAT))) <> 0
THEN ROUND(SUM(CAST(Figure1 AS FLOAT)) / SUM(CAST(Figure2 AS FLOAT))
* 100
,2) ELSE 0 END
FROM [Schema].[Table] m)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.