Calcul des valeurs moyennes pour différentes passes à l'aide de SQL
Dans MySQL, la récupération des valeurs moyennes en regroupant les données peut être obtenue avec AVG et GROUP BY fonctions. Cependant, lorsqu'il s'agit de plusieurs critères, comme calculer des moyennes pour différentes valeurs d'une colonne spécifique, la tâche devient légèrement plus complexe.
Dans ce cas, le but est d'extraire la moyenne de la colonne 'val' pour chaque « identifiant » unique pour différentes valeurs de « pass », qui peuvent aller de 1 à 7.
Solution de sous-requête
Une approche consiste à utiliser une sous-requête pour chaque valeur de « pass » dans la fonction AVG. Cela renverra un ensemble de valeurs pour chaque combinaison « id » et « pass ».
<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 = 7) as val_7 from data_r1 d1 GROUP BY d1.id</code>
Cette requête récupère d'abord les valeurs « id » uniques de la table « data_r1 ». Ensuite, pour chaque « id », il exécute sept sous-requêtes pour calculer la valeur moyenne de chaque valeur possible de « pass » et les stocke dans des colonnes « val_n » distinctes. La fonction IFNULL est utilisée pour gérer tous les cas où la sous-requête renvoie des valeurs NULL, garantissant que le résultat est un nombre ou zéro.
L'avantage de cette approche est qu'elle renvoie une seule ligne pour chaque « identifiant », ce qui facilite le travail avec les résultats. Cependant, cela peut être quelque peu verbeux, surtout s'il existe de nombreuses valeurs possibles pour « pass ».
Approche alternative
Si vous préférez une méthode plus concise, vous pouvez utilisez une combinaison d'instructions GROUP BY et CASE pour obtenir un résultat similaire :
<code class="sql">SELECT id, SUM(CASE WHEN pass = 1 THEN val END) / COUNT(DISTINCT CASE WHEN pass = 1 THEN id END) AS val_1, SUM(CASE WHEN pass = 2 THEN val END) / COUNT(DISTINCT CASE WHEN pass = 2 THEN id END) AS val_2, [...] SUM(CASE WHEN pass = 7 THEN val END) / COUNT(DISTINCT CASE WHEN pass = 7 THEN id END) AS val_7 FROM data_r1 GROUP BY id</code>
Cette requête utilise plusieurs instructions CASE pour évaluer la valeur « pass » et n'inclut que les valeurs « val » correspondantes dans le calcul. Les expressions COUNT(DISTINCT ...) dans le dénominateur garantissent que la moyenne est calculée correctement, même s'il existe plusieurs valeurs « val » pour une combinaison spécifique « id » et « pass ».
Encore une fois, la fonction IFNULL peut être utilisée pour gérer tous les cas où la division aboutit à NULL afin de garantir que le résultat est un nombre ou zéro.
Quelle que soit l'approche que vous choisissez, ces requêtes extrairont efficacement les valeurs moyennes de « val » pour chaque « identifiant » unique pour les différentes valeurs de « pass » de la table « data_r1 ».
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!