Maison >base de données >tutoriel mysql >Comment puis-je calculer les valeurs moyennes pour chaque « passe » pour le même « id » et faire pivoter les données pour une ligne par « id » en SQL ?

Comment puis-je calculer les valeurs moyennes pour chaque « passe » pour le même « id » et faire pivoter les données pour une ligne par « id » en SQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-25 18:09:02505parcourir

How can I calculate average values for each 'pass' for the same 'id' and pivot the data for one row per 'id' in SQL?

Requête SQL avec AVG et GROUP BY

En SQL, vous pouvez rencontrer une situation où vous devez extraire des moyennes groupées d'une table. Ceci peut être réalisé à l'aide des clauses AVG() et GROUP BY.

Considérez l'exemple de tableau :

id pass val
DA02959106 5.00 44.40
08A5969201 1.00 182.41
08A5969201 2.00 138.78
DA02882103 5.00 44.73
DA02959106 1.00 186.15
DA02959106 2.00 148.27
DA02959106 3.00 111.91
DA02959106 4.00 76.15
DA02959106 5.00 44.40
DA02959106 4.00 76.65

Calcul des valeurs moyennes pour chaque passe

Pour calculer la valeur moyenne de chaque « passe » pour le même « id », utilisez la requête suivante :

<code class="sql">SELECT id, pass, AVG(val) AS val_1
FROM data_r1
GROUP BY id, pass;</code>

Cette requête regroupe les lignes à la fois par « id » et « pass » et calcule le « val » moyen pour chaque groupe. Le résultat serait :

id pass val_1
DA02959106 1.00 186.15
08A5969201 1.00 182.41
DA02882103 5.00 44.73
08A5969201 2.00 138.78
DA02959106 2.00 148.27
DA02959106 3.00 111.91
DA02959106 4.00 76.40
DA02959106 5.00 44.40

Pivoter les données pour une ligne par ID

Si vous préférez avoir une ligne par « ID » avec plusieurs colonnes représentant le valeurs moyennes pour chaque « réussite », utilisez la requête suivante :

<code class="sql">SELECT d1.id,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 1) as val_1,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 2) as val_2,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 3) as val_3,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 4) as val_4,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 5) as val_5,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 6) as val_6,
    (SELECT IFNULL(ROUND(AVG(d2.val), 4), 0) FROM data_r1 d2
     WHERE d2.id = d1.id AND pass = 7) as val_7
from data_r1 d1
GROUP BY d1.id;</code>

Cette requête utilise des sous-requêtes pour extraire les valeurs moyennes de chaque « réussite » et les affecte aux colonnes correspondantes. Le tableau résultant serait :

id val_1 val_2 val_3 val_4 val_5 val_6 val_7
DA02959106 186.15 148.27 111.91 76.40 44.40 0 0

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn