Maison > base de données > tutoriel mysql > Comment résoudre l'erreur SQL « La colonne doit apparaître dans la clause GROUP BY » ?

Comment résoudre l'erreur SQL « La colonne doit apparaître dans la clause GROUP BY » ?

Mary-Kate Olsen
Libérer: 2025-01-18 14:06:13
original
780 Les gens l'ont consulté

How to Solve the SQL

Résolution de « Erreur : la colonne doit apparaître dans la clause GROUP BY »

En SQL, lors de l'exécution d'une opération d'agrégation (comme trouver la valeur maximale), les colonnes utilisées pour l'agrégation doivent également apparaître dans la clause GROUP BY. Si vous ne le faites pas, l'erreur apparaîtra : "La colonne doit apparaître dans une clause GROUP BY ou être utilisée comme fonction d'agrégation".

Supposons que vous souhaitiez trouver la valeur moyenne maximale (avg) pour chaque nom de client (cname) dans le tableau :

SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
Copier après la connexion

Cette requête renverra une erreur car wmname n'est pas inclus dans la clause GROUP BY. Pour résoudre ce problème, vous pouvez simplement regrouper par cname et wmname :

SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;
Copier après la connexion

Cependant, cette méthode ne produit pas le résultat attendu, à savoir afficher la valeur moyenne maximale pour chaque cname unique. Au lieu de cela, il sera regroupé par cname et wmname, ce qui entraînera plusieurs lignes par cname. Pour corriger ce problème, suivez l'une des méthodes suivantes :

Utiliser des sous-requêtes et des jointures

  1. Calculez la valeur moyenne maximale pour chaque cname dans une sous-requête :
SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;
Copier après la connexion
  1. Joignez la sous-requête à la table d'origine pour récupérer les colonnes requises :
SELECT m.cname, m.wmname, t.mx
FROM (
    SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname
    ) t JOIN makerar m ON m.cname = t.cname AND t.mx = m.avg;
Copier après la connexion

Utiliser les fonctions de fenêtre

Les fonctions de fenêtre vous permettent d'effectuer des calculs sur les lignes d'une fenêtre spécifiée. Dans ce cas, vous pouvez utiliser la clause PARTITION BY pour regrouper par cname et calculer la valeur moyenne maximale dans chaque partition :

SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx
FROM makerar;
Copier après la connexion

Cette méthode affichera tous les enregistrements, mais elle affichera correctement la valeur moyenne maximale par cname et par ligne.

Gérer les tuples uniques correspondants

Si vous souhaitez afficher uniquement les tuples uniques correspondant à la valeur moyenne maximale, vous pouvez utiliser la méthode suivante :

  1. Utilisez la fonction ROW_NUMBER() pour calculer le classement des valeurs moyennes au sein de chaque partition cname :
SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn 
FROM makerar;
Copier après la connexion
  1. Joignez le résultat avec la table d'origine pour filtrer rn = 1 (le premier tuple classé) :
SELECT DISTINCT /* distinct matters here */
    m.cname, m.wmname, t.avg AS mx
FROM (
    SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn 
    FROM makerar
) t JOIN makerar m ON m.cname = t.cname AND m.wmname = t.wmname AND t.rn = 1;
Copier après la connexion

Cette méthode renverra une liste de tuples uniques contenant la valeur moyenne maximale pour chaque cname. Notez l'ajout de ORDER BY avg DESC pour garantir que le classement est par ordre décroissant en fonction de avg.

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 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