我正在尝试计算需要考虑百分比的百分比的平均值。
我目前正在使用以下公式来排除那些最终会以零结尾的公式,但这会扭曲数字。
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)
我明显得到以下错误;
遇到零除错误。声明已经终止。
如何更改此项以包含基于零的百分比而不出现错误?
答案 0 :(得分:0)
问题将除以零 - 所以只有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)
答案 1 :(得分:0)
防止除以零的一个好方法是使用NULLIF函数,如下所示:
SET Average = (SELECT ROUND(AVG((CAST(Figure1 AS FLOAT)/NULLIF(CAST(Figure2 AS FLOAT), 0))*100),2)
FROM [Schema].[Table] m)
使用NULLIF方法,将返回值为NULL的行,其中Figure2为0. AVG函数忽略NULL值。因此,请仔细考虑这是否是您想要使用的解决方案(因为结果可能与您的预期不同)。
答案 2 :(得分:0)
嗯,真正的问题是除以零会产生未定义的结果,所以它们不应该是任何计算的一部分。
如果你决定将它们考虑在内,你必须给它们一些名义价值。我们假设您想使用"零"作为名义价值:你可以这样做:
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
答案 3 :(得分: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)
如果你想将图2为零的记录平均为零,是好的,但我个人根本不想要它们并且会使用
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分。然后我会做以下事情。仍然考虑到图2中的结果是否真的为零。
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)