Requête SQL avec AVG et Group By
Dans MySQL, une requête qui extrait plusieurs moyennes d'une colonne pour différents groupes au sein d'une table peut être obtenu en utilisant une combinaison des clauses AVG() et GROUP BY. Considérons une table data_r1 avec la structure suivante :
mysql> select id, pass, val from data_r1 limit 10; +------------+--------------+----------------+ | id | pass | val | +------------+--------------+----------------+ | DA02959106 | 5.0000000000 | 44.4007000000 | | 08A5969201 | 1.0000000000 | 182.4100000000 | | 08A5969201 | 2.0000000000 | 138.7880000000 | | DA02882103 | 5.0000000000 | 44.7265000000 | | DA02959106 | 1.0000000000 | 186.1470000000 | | DA02959106 | 2.0000000000 | 148.2660000000 | | DA02959106 | 3.0000000000 | 111.9050000000 | | DA02959106 | 4.0000000000 | 76.1485000000 | | DA02959106 | 5.0000000000 | 44.4007000000 | | DA02959106 | 4.0000000000 | 76.6485000000 |
Pour extraire les informations souhaitées de cette table, utilisez la requête suivante :
SELECT id, pass, AVG(val) AS val FROM data_r1 GROUP BY id, pass;
Cette requête regroupe les lignes de la table data_r1 par les colonnes id et pass, puis calcule la valeur moyenne de la colonne val pour chaque groupe. Le résultat est un tableau avec une ligne pour chaque combinaison unique d'identifiant et de pass, avec la valeur moyenne correspondante pour val.
Une requête alternative, qui obtient le même résultat mais renvoie une seule ligne pour chaque identifiant unique avec plusieurs valeurs moyennes :
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
Cette requête utilise des sous-requêtes imbriquées pour calculer les valeurs moyennes de chaque valeur de réussite au sein d'un groupe d'identifiants spécifique. La fonction IFNULL() est utilisée pour garantir que les valeurs nulles sont remplacées par 0, empêchant ainsi les erreurs de division par zéro.
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!