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
Libérer: 2025-01-10 15:06:44
original
149 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal