Erreur SQL : la colonne doit apparaître dans une clause GROUP BY ou être utilisée comme fonction d'agrégation
Lors de l'exécution d'une requête d'agrégation groupée, vous devez vous assurer que les colonnes sélectionnées soit apparaissent dans la clause GROUP BY
, soit participent au calcul de la fonction d'agrégation. Sinon, un message d'erreur similaire à « La colonne doit apparaître dans une clause GROUP BY ou être utilisée comme fonction d'agrégation » apparaîtra.
Description du problème
Supposons qu'il existe une table nommée makerar
avec les colonnes cname
, wmname
et avg
. Le but est d'obtenir la cname
valeur maximale pour chaque avg
distinct. Cependant, exécutez la requête suivante :
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;</code>
générera une erreur car la colonne wmname
n'est ni incluse dans la clause GROUP BY
ni utilisée comme fonction d'agrégation.
Solution
Il existe deux manières principales de résoudre ce problème :
1. Sous-requête et méthode de jointure
Cette méthode utilise une sous-requête pour calculer la valeur cname
maximale pour chaque avg
, puis joint la sous-requête à la table principale pour récupérer le wmname
correspondant :
<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>
2. Méthode de fonction fenêtre
Les fonctions de fenêtre offrent une alternative plus simple pour effectuer des calculs agrégés au sein de groupes :
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar ;</code>
Remarque : Bien que la fonction de fenêtre affiche correctement la valeur maximale cname
pour chaque avg
, cela peut entraîner des enregistrements en double.
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!