Résolution de l'erreur SQL : "Les colonnes doivent apparaître dans une clause GROUP BY ou être utilisées comme fonction d'agrégation"
Dans une requête SQL, si le champ de sélection n'est pas inclus dans la clause GROUP BY
et qu'aucune opération d'agrégation n'est effectuée, "La colonne 'wmname' doit apparaître dans la clause GROUP BY ou être utilisée comme fonction d'agrégation. " message d'erreur .
Plus précisément, vous essayez de trouver la moyenne maximale (avg) pour chaque pays (cname) tout en renvoyant le nom du responsable pays correspondant (wmname). Cependant, wmname n'est ni inclus dans la clause GROUP BY
ni utilisé dans aucune fonction d'agrégation.
Solutions possibles :
Il existe plusieurs façons de résoudre ce problème :
Méthode 1 : Utiliser des sous-requêtes et des jointures
Cette méthode consiste à créer une sous-requête pour calculer la moyenne maximale pour chaque pays, puis à joindre le résultat au tableau d'origine pour contenir les noms des responsables pays.
<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>
Méthode 2 : Utiliser la fonction fenêtre
Les fonctions de fenêtre permettent d'obtenir ce résultat sans utiliser de sous-requête.
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;</code>
Méthode 3 : utilisez DISTINCT et ROW_NUMBER()
Une approche plus explicite consiste à utiliser DISTINCT
pour garantir des résultats uniques et ROW_NUMBER()
pour sélectionner uniquement les lignes avec la moyenne la plus élevée par pays.
<code class="language-sql">SELECT DISTINCT /* distinct here matters, because maybe there are various tuples for the same max value */ 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>
En utilisant l'une de ces méthodes, vous pouvez récupérer les résultats attendus où le nom du responsable pays (wmname) est correctement associé à la moyenne maximale pour chaque pays. Veuillez faire attention à la clause ROW_NUMBER()
de ORDER BY
dans la troisième méthode, qui est cruciale pour la sélection correcte de la moyenne maximale. Les versions précédentes manquaient cette clause, ce qui pouvait conduire à des résultats incorrects.
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!