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 » ?
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>
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>
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>
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>
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!