Différence de précision entre la fonction AVG et la division de sum

Des questions similaires ont déjà été posées, mais aucune n'a cherché à savoir pourquoi la fonction AVG dans MSSQL produit une valeur différente de SUM et SUM explicites lorsqu'aucune NULL n'est présente dans datatables.

Je voudrais calculer le score pour datatables dans ce TestTable (simplifié).

 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 

Le score est calculé comme score = sum(CorrectCount) / sum(CorrectCount+IncorrectCount)

La requête suivante

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

produit cette sortie:

 ScoreAverage ScoreSumDivide 0.876666666666667 0.886363636363636 

D'où vient cette différence? Qu'est-ce que AVG fait différemment de SUM et divide? Je cherche une explication pourquoi le résultat de l'AVG est différent du SUM(CorrectCount) / SUM(CorrectCount+IncorrectCount) . Je suppose que c'est dû à la précision ou à l'arrondi interne à la fonction AVG .

C'est simplement comment les maths fonctionnent. Votre score moyen prend une moyenne des pourcentages individuels. Si C1, C2 … Cn est vos scores corrects et I1, I2 … In est vos scores incorrects et "N" est le nombre d'loggings alors les maths ressembleront à ceci:

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

Votre sum totale d'abord additionne tous vos scores corrects et additionne tous vos scores totaux, puis calcule le pourcentage. Les maths de ce look sont les suivants:

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

Les deux nombres sont significatifs, mais le second reflétera mieux le pourcentage de counts corrects pour l'set des données.

Mon commentaire n'a probablement pas été compris, alors je l'élargis ici. Supposons que vous avez des counts corrects / incorrects comme:

5/2 3/1

Moyennage correct / (Correct + Incorrect) signifie (5/7 + 3/4) / 2 = 41/56 Cependant Somme (Correct) / Somme (Correct + Incorrect) signifie (5 + 3) / (7 + 4) = 8 / 11

41/56! = 8/11

Si vous avez fait: Somme (Corriger / (Correct + Incorrect)) / Compter ce serait: (5/7 + 3/4) / 2 = 41/56 qui est égal à avg.

Je pense que vous calculez simplement différentes choses là-bas. L'équivalent pour l'AVG doit être SUM (CorrectCount / (CorrectCount + IncorrectCount)) / COUNT (*).

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

Votre calcul moyen request une modification.

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

Cela renvoie la valeur correcte de 0,886363 (39/44) plutôt que ce qui ressemble à un problème d'arrondi sans elle.