之前已经提出了类似的问题,但没有一个问题解决了为什么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
这种差异来自哪里? AVG
与SUM
和 - 除外有何不同?我正在寻找解释为什么AVG的结果与显式SUM(CorrectCount) / SUM(CorrectCount+IncorrectCount)
不同的原因。我希望这是由于AVG
函数的内部精度或舍入。
答案 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)而不是没有它的舍入问题。