Maison >base de données >tutoriel mysql >Pourquoi ma requête SQL génère-t-elle une erreur « la colonne doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation » ?

Pourquoi ma requête SQL génère-t-elle une erreur « la colonne doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation » ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-18 13:52:09472parcourir

Why Does My SQL Query Throw a

Résolution de l'erreur SQL « Doit apparaître dans la clause GROUP BY ou être utilisé dans une fonction d'agrégation »

L'erreur SQL "la colonne "makerar.wmname" doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation" se produit lorsque votre requête regroupe des données (à l'aide de GROUP BY) mais sélectionne des colonnes non impliquées dans le regroupement. SQL exige que toute colonne sélectionnée ne figurant pas dans la clause GROUP BY soit agrégée (par exemple, en utilisant MAX, MIN, AVG, SUM, COUNT) ou omise.

Solutions :

Voici plusieurs approches pour résoudre ce problème :

  1. Inclure wmname dans la clause GROUP BY :

    C'est la solution la plus simple si vous avez besoin de toutes les wmname valeurs associées à chaque cname unique.

    <code class="language-sql">SELECT cname, wmname, MAX(avg)
    FROM makerar
    GROUP BY cname, wmname;</code>
  2. Sous-requête pour la valeur maximale et JOIN :

    Cette approche est utile lorsque vous n'avez besoin que du wmname correspondant au maximum avg pour chaque cname.

    <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 m.avg = t.mx;</code>

    Ceci trouve d'abord le maximum avg pour chaque cname dans une sous-requête. Ensuite, il joint ce résultat à la table d'origine pour récupérer le wmname correspondant.

  3. Fonctions de fenêtre (si prises en charge) :

    Si votre système de base de données prend en charge les fonctions de fenêtre (la plupart des systèmes modernes le font), cela fournit une solution concise et efficace.

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

    Les fonctions de fenêtre calculent le maximum avg pour chaque cname partition sans modifier la structure de ligne d'origine. Vous pourriez avoir besoin de DISTINCT si vous souhaitez uniquement des résultats uniques.

En implémentant l'une de ces méthodes, vous récupérerez correctement la moyenne maximale (avg) pour chaque cname tout en gérant la colonne wmname de manière appropriée, éliminant ainsi l'erreur SQL. Choisissez la solution qui correspond le mieux à vos besoins spécifiques en matière de données et aux capacités de votre base de données.

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