Maison > base de données > tutoriel mysql > Comment résoudre « la colonne « nom_wm » doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation » dans SQL ?

Comment résoudre « la colonne « nom_wm » doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation » dans SQL ?

Barbara Streisand
Libérer: 2025-01-18 13:56:11
original
397 Les gens l'ont consulté

How to Solve

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

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

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

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!

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