在计算中包括零数字而不会除以零误差

时间:2014-05-08 15:12:33

标签: sql sql-server tsql

我正在尝试计算需要考虑百分比的百分比的平均值。

我目前正在使用以下公式来排除那些最终会以零结尾的公式,但这会扭曲数字。

  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)

我明显得到以下错误;

  

遇到零除错误。声明已经终止。

如何更改此项以包含基于零的百分比而不出现错误?

4 个答案:

答案 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)
相关问题