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
Libérer: 2025-01-18 13:52:09
original
395 Les gens l'ont consulté

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

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

    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!

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