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
Mary-Kate Olsenoriginal
2025-01-18 14:06:13780parcourir

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 :

<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;</code>

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 :

<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;</code>

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 :
<code class="language-sql">SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;</code>
  1. Joignez la sous-requête à la table d'origine pour récupérer les colonnes requises :
<code class="language-sql">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;</code>

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 :

<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx
FROM makerar;</code>

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 :
<code class="language-sql">SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn 
FROM makerar;</code>
  1. Joignez le résultat avec la table d'origine pour filtrer rn = 1 (le premier tuple classé) :
<code class="language-sql">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;</code>

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