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

Pourquoi ma requête SQL échoue-t-elle avec « doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation » ?

Mary-Kate Olsen
Libérer: 2025-01-18 14:11:10
original
732 Les gens l'ont consulté

Why Does My SQL Query Fail with

Résoudre l'erreur de requête SQL : "doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation"

En SQL, lors de l'exécution d'opérations d'agrégation (telles que MAX, MIN, SUM, etc.), les colonnes de la liste SELECT doivent apparaître dans la clause GROUP BY, ou être incluses dans une fonction d'agrégation. Cette restriction garantit que les résultats sont correctement regroupés et que les valeurs globales sont calculées correctement.

Par exemple, supposons que votre tableau contienne des colonnes cname, wmname et avg et que vous souhaitiez trouver la valeur cname maximale pour chaque avg. Votre requête initiale est la suivante :

<code class="language-sql">SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname;</code>
Copier après la connexion

Cette requête échoue car la colonne wmname n'est ni incluse dans la clause GROUP BY ni utilisée dans une fonction d'agrégation. Cela signifie que la fonction d'agrégation MAX est évaluée sans regroupement par wmname, ce qui entraîne des résultats incorrects.

Les méthodes suivantes peuvent résoudre ce problème :

Méthode 1 : Inclure wmname dans la clause GROUP BY :

<code class="language-sql">SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname, wmname;</code>
Copier après la connexion

Cette méthode renvoie la valeur cname maximale pour chaque combinaison wmname et avg.

Méthode 2 : Utiliser la sous-requête :

<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

Cette méthode calcule d'abord la valeur cname maximale pour chaque avg à l'aide d'une sous-requête, puis la joint à la table d'origine pour récupérer la valeur wmname correspondante.

Méthode 3 : Utiliser la fonction fenêtre :

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

La fonction Fenêtre MAX(avg) OVER (PARTITION BY cname) calcule la valeur cname maximale pour chaque avg et conserve toutes les lignes du résultat. Cependant, cette méthode peut afficher des lignes en double s'il existe plusieurs lignes avec la même valeur cname maximale pour un avg donné.

En respectant correctement l'exigence selon laquelle les colonnes de fonctions non agrégées doivent apparaître dans la clause GROUP BY, vous pouvez garantir que les requêtes agrégées produisent des résultats précis et significatifs.

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