web-dev-qa-db-fra.com

Le motif de la colonne n'est pas valide dans la liste de sélection car il ne figure ni dans une fonction d'agrégat ni dans la clause GROUP BY

Duplicate possible:
confusion de GROUP BY/fonction d'agrégat dans SQL

J'ai une erreur -

La colonne 'Employee.EmpID' n'est pas valide dans la liste de sélection car elle ne figure ni dans une fonction d'agrégat ni dans la clause GROUP BY.


_select loc.LocationID, emp.EmpID
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by loc.LocationID 
_

Cette situation s’inscrit dans la réponse donnée par Bill Karwin.

correction pour ce qui précède, rentre dans la réponse par ExactaBox -

_select loc.LocationID, count(emp.EmpID) -- not count(*), don't want to count nulls
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by loc.LocationID 
_

QUESTION ORIGINALE -

Pour la requête SQL -

_select *
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by (loc.LocationID)
_

Je ne comprends pas pourquoi je reçois cette erreur. Tout ce que je veux faire est de rejoindre les tables, puis de regrouper tous les employés d’un lieu donné.

Je pense avoir une explication partielle de ma propre question. Dis-moi si tout va bien -

Pour regrouper tous les employés travaillant au même endroit, nous devons d'abord mentionner le LocationID.

Ensuite, nous ne pouvons pas/ne mentionnons pas chaque ID d'employé à côté. Nous mentionnons plutôt le nombre total d’employés à cet endroit, c’est-à-dire que nous devrions SUM () les employés travaillant à cet endroit. Pourquoi faisons-nous la dernière manière, je ne suis pas sûr. Cela explique donc la partie "de l’erreur" "elle ne figure pas dans une fonction globale".

Quelle est l'explication de la clause GROUP BY de l'erreur?

243
david blaine

Supposons que j'ai le tableau suivant T:

a   b
--------
1   abc
1   def
1   ghi
2   jkl
2   mno
2   pqr

Et je fais la requête suivante:

SELECT a, b
FROM T
GROUP BY a

La sortie doit comporter deux lignes, une où a=1 et une deuxième ligne où a=2.

Mais que doit indiquer la valeur de b sur chacune de ces deux lignes? Il y a trois possibilités dans chaque cas, et rien dans la requête n'indique clairement quelle valeur choisir pour b dans chaque groupe. C'est ambigu.

Ceci illustre la règle à valeur unique, qui interdit les résultats non définis que vous obtenez lorsque vous exécutez une requête GROUP BY et que vous incluez toutes les colonnes de la liste de sélection qui ne font pas partie des critères de regroupement, ni apparaissent dans les fonctions d'agrégation (SUM, MIN, MAX, etc.).

Cela pourrait ressembler à ceci:

SELECT a, MAX(b) AS x
FROM T
GROUP BY a

Maintenant, il est clair que vous voulez le résultat suivant:

a   x
--------
1   ghi
2   pqr
498
Bill Karwin

Votre requête fonctionnera dans MYSQL si vous désactivez ONLY_FULL_GROUP_BY en mode serveur ( et par défaut, il s'agit de ). Mais dans ce cas, vous utilisez un SGBDR différent. Donc, pour que votre requête fonctionne, ajoutez toutes les colonnes non agrégées à votre clause GROUP BY, par exemple

SELECT col1, col2, SUM(col3) totalSUM
FROM tableName
GROUP BY col1, col2

Les colonnes non agrégées signifient que la colonne n'est pas passée dans des fonctions agrégées telles que SUM, MAX, COUNT, etc.

57
John Woo

"Tout ce que je veux, c'est joindre les tables, puis regrouper tous les employés d'un endroit donné."

Il semble que ce que vous voulez, c’est que le résultat de l’instruction SQL dresse la liste de tous les employés de la société, mais d’abord tous les employés du bureau d’Anaheim, puis ceux du bureau de Buffalo, puis ceux du bureau de Cleveland (A, B, C, comprends, évidemment je ne sais pas quels endroits tu as).

Dans ce cas, perdez l'instruction GROUP BY. Tout ce dont vous avez besoin est ORDER BY loc.LocationID

15
ExactaBox

En gros, cette erreur indique que si vous utilisez la clause GROUP BY, votre résultat sera une relation/table avec une ligne pour chaque groupe, donc dans votre instruction SELECT vous pouvez uniquement "sélectionner" la colonne que vous regroupez et utiliser des fonctions d'agrégation sur cette colonne, car les autres colonnes n'apparaîtront pas dans la table résultante.

9
Alex W