3 votes

Moyenne de plusieurs colonnes sans données impliquées

J'ai les données suivantes dans le tableau score ci-dessous :

No   !  id   !  A      !  B    ! average  !
------------------------------------------
1    !  01   !  80     !  60   !    70    !
2    !  02   !         !  60   !    30    !
3    !  03   !  0      !  60   !    30    !
4    !  04   !  80     !       !    40    !

Je veux obtenir la moyenne des colonnes A et B en utilisant le code ci-dessous :

Select id, (avg(A)+avg(B))/2 as Average
from score
Group by id;

le problème est, id 02 y id 04 n'ont qu'une seule donnée. La moyenne les comptera comme 0 au lieu d'aucune donnée.

Le tableau que je veux est le suivant J'ai les données suivantes dans le tableau score ci-dessous :

No   !  id   !  A      !  B    ! average  !
------------------------------------------
1    !  01   !  80     !  60   !    70    !
2    !  02   !         !  60   !    60    !
3    !  03   !  0      !  60   !    30    !
4    !  04   !  80     !       !    80    !

Quelqu'un peut m'aider ?

3voto

Tim Biegeleisen Points 53335

Essayez cette requête :

SELECT id, (SUM(COALESCE(A,0)) + SUM(COALESCE(B,0))) / (COUNT(A) + COUNT(B))
FROM score
GROUP by id

L'astuce ici est de calculer la moyenne en morceaux, en prenant la SUM divisé par le COUNT et en utilisant COALESCE() de manière appropriée pour traiter NULL valeurs. Gardez à l'esprit que les fonctions d'agrégation de MySQL ( SUM , COUNT etc.) ignorer NULL par défaut.

J'ai testé la requête et vous pouvez ajouter des colonnes supplémentaires au-delà de A y B et ça semble toujours fonctionner.

Démonstration :

SQLFiddle

0voto

Vous ne pouvez pas avoir de moyennes à virgule flottante dans un champ de nombres entiers. Malheureusement, le calcul de la moyenne donnera des résultats entiers, donc une moyenne de, disons, 0 et 1 sera 0. Ceci étant dit, votre "moyenne" est garantie d'être au moins aussi grande que le champ MIN() de la colonne, et pas plus grande que la valeur de la MAX() dans la colonne. Si vous souhaitez que les nombres à virgule flottante soient reportés dans la même colonne que les nombres entiers, n'en faites pas une colonne de nombres entiers !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X