[英]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.