AVG函数和求和之间的精度差异

时间:2016-05-18 13:40:35

标签: sql-server

之前已经提出了类似的问题,但没有一个问题解决了为什么MSSQL中的AVG函数产生的值与显式SUM不同,并且当没有NULL值存在时数据

我想计算此(简化)TestTable中数据的分数。

CorrectCount IncorrectCount
5.0          0.0
3.0          2.0
5.0          0.0
4.0          0.0
3.0          0.0
5.0          0.0
2.0          1.0
5.0          0.0
5.0          0.0
2.0          2.0

分数计算为score = sum(CorrectCount) / sum(CorrectCount+IncorrectCount)

以下查询

SELECT
  AVG(CorrectCount / (CorrectCount+IncorrectCount)) as ScoreAverage,
  SUM(CorrectCount) / SUM(CorrectCount+IncorrectCount) as ScoreSumDivide
FROM TestTable

生成此输出:

ScoreAverage      ScoreSumDivide
0.876666666666667 0.886363636363636

这种差异来自哪里? AVGSUM和 - 除外有何不同?我正在寻找解释为什么AVG的结果与显式SUM(CorrectCount) / SUM(CorrectCount+IncorrectCount)不同的原因。我希望这是由于AVG函数的内部精度或舍入。

4 个答案:

答案 0 :(得分:3)

可能我的评论不被理解,所以我在这里扩展它。假设您有正确/不正确的计数:

5/2 3/1

平均正确/(正确+不正确)表示(5/7 + 3/4)/ 2 = 41/56 但总和(正确)/总和(正确+不正确)表示(5 + 3)/(7 + 4)= 8/11

41/56!= 8/11

如果你这样做:总和(正确/(正确+不正确))/计数它将是:(5/7 + 3/4)/ 2 = 41/56等于平均值​​。

答案 1 :(得分:2)

我认为你只是在那里计算不同的东西。 AVG的aquivalent应该是SUM(CorrectCount /(CorrectCount + IncorrectCount))/ COUNT(*)。

SELECT
    AVG(CorrectCount / (CorrectCount+IncorrectCount)) as ScoreAverage,
    SUM(CorrectCount / (CorrectCount + IncorrectCount)) / COUNT(*) ScoreSumDivide

答案 2 :(得分:2)

这简直就是数学的运作方式。您的平均得分取平均百分比。如果C1,C2 ... Cn是你的正确分数而I1,I2 ...... In是你的错误分数而“N”是记录的数量,那么数学将看起来如下:

    C1/(C1+ I1) + C2 /(C2 + I2) + ... + Cn /(Cn + In)
    -------------------------------------------------
                           N

您的总和平均值首先将所有正确分数相加,然后将所有总分数相加,然后计算百分比率。这个外观的数学如下:

                C1 + C2 + ... + Cn
    ----------------------------------------------
    (C1+ I1) + (C2 + I2) + ... + (Cn + In)

这两个数字都有意义,但第二个数字会更好地反映整个数据集的正确计数百分比。

答案 3 :(得分:1)

您的平均计算需要修改;

  ,AVG(CorrectCount) / (AVG(CorrectCount)+AVG(IncorrectCount)) as ScoreAverage

这会返回正确的值0.886363(39/44)而不是没有它的舍入问题。