Gestion de plusieurs lignes de résultats dans le regroupement et le tri SQL
Dans les requêtes qui regroupent et trient des données, vous rencontrez souvent cette situation : plusieurs lignes avec la même clé de regroupement, mais des valeurs différentes pour les autres colonnes. Cela peut empêcher d’obtenir les données globales requises.
Par exemple, une requête qui regroupe les données par modèle matériel peut renvoyer plusieurs lignes avec des « résultats » différents pour le même modèle. Pour condenser cela en une ligne par modèle, vous pouvez modifier la requête de sorte que les valeurs réelles 0 donnent lieu à des valeurs 0 et que les valeurs non nulles donnent lieu à des valeurs 1. Cependant, cette approche produit toujours plusieurs lignes pour les modèles avec plusieurs valeurs de « résultat ».
La clé pour obtenir l'agrégation souhaitée est de regrouper par l'expression CASE plutôt que par la colonne source représentant le résultat. En regroupant par valeur de condition, une requête peut combiner des lignes avec la même clé de regroupement et le même résultat de condition.
Par exemple, la requête suivante regroupe par nom de modèle, type d'essai et expression CASE utilisée pour convertir la valeur du résultat :
<code class="language-sql">SELECT CURRENT_DATE-1 AS day, model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END, count(*) FROM attempt attempt, prod_hw_id prod_hw_id, model model WHERE time >= '2013-11-06 00:00:00' AND time < '2013-11-07 00:00:00' GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END ORDER BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END;</code>
Vous pouvez également utiliser l'alias de colonne de l'expression CASE pour la distinguer de la colonne source du résultat :
<code class="language-sql">SELECT CURRENT_DATE-1 AS day, model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1, count(*) FROM attempt attempt, prod_hw_id prod_hw_id, model model WHERE time >= '2013-11-06 00:00:00' AND time < '2013-11-07 00:00:00' GROUP BY model.name, attempt.type, result1 ORDER BY model.name, attempt.type, result1;</code>
Il est important de se rappeler que le regroupement par expression CASE à l'aide de références de position (par exemple, "GROUP BY 1,2,3") est plus résistant aux modifications dans la liste SELECT que l'utilisation de noms de colonnes dans la clause GROUP BY.
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!