簡體   English   中英

在計算中包括零數字而不會被零誤差除

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM