Maison >base de données >tutoriel mysql >Comment gérer plusieurs lignes de résultats lors du regroupement et du classement des données dans SQL ?

Comment gérer plusieurs lignes de résultats lors du regroupement et du classement des données dans SQL ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-10 15:06:44197parcourir

How to Handle Multiple Result Rows When Grouping and Ordering Data in SQL?

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!

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