La raison de la colonne n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction agrégée ou le groupe par clause [dupliquer]

possible Duplicate:

groupe par / fonction agrégée confusion dans SQL

j'ai eu une erreur

Colonne " Employé.EmpID' n'est pas valide dans la liste select parce qu'il est ne figurant ni dans une fonction agrégée ni dans le groupe par clause.


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 le projet de Loi Karwin.

correction pour ci-dessus, correspond à la réponse de 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 INITIALE -

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 j'ai cette erreur. Tout ce que je veux, c'est rejoindre les tables et regrouper tous les employés dans un endroit particulier. ainsi.

je pense avoir une explication partielle pour ma propre question. Dites - moi si c'est ok -

pour regrouper tous les employés qui travaillent au même endroit, nous devons d'abord mentionner le lieu ID.

ensuite, nous ne pouvons pas/ne mentionnons pas chaque identification d'employé à côté. Nous indiquons plutôt le nombre total d'employés à cet endroit, c'est-à-dire que nous devrions additionner() les employés travaillant à cet endroit. Pourquoi nous le faisons la dernière façon, je ne suis pas sûr. Ainsi, cela explique la partie de l'erreur "elle n'est contenue dans aucune des deux fonctions agrégées".

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

206
demandé sur dreftymac 2012-12-22 07:31:35

4 réponses

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 avoir deux lignes, une ligne 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 précise de la valeur à choisissez b dans chaque groupe. C'est ambigu.

cela démontre la règle de la valeur unique , qui interdit les résultats non définis que vous obtenez lorsque vous exécutez un groupe par requête, et vous incluez toutes les colonnes dans la liste de sélection qui ne font pas partie des critères de regroupement, ni n'apparaissent dans les fonctions agrégées (somme, MIN, MAX, etc.).

Fixation il 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
440
répondu Bill Karwin 2018-01-04 13:32:46

votre requête fonctionnera dans MYSQL si vous désactivez ONLY_FULL_GROUP_BY mode serveur ( et par défaut il est ). Mais dans ce cas, vous utilisez des RDBM différents. Donc, pour faire fonctionner votre requête, ajouter toutes les colonnes non agrégées à votre GROUP BY clause, eg

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

Non-Agrégées colonnes signifie que la colonne n'est pas passer dans agrégées des fonctions comme SUM , MAX , COUNT , etc..

48
répondu John Woo 2012-12-22 03:59:42

"Tout ce que je veux faire est de rejoindre les tables et les regrouper tous les employés dans un endroit particulier ensemble."

on dirait que ce que vous voulez, c'est que la sortie de la déclaration SQL répertorie tous les employés de L'entreprise, mais d'abord tous les employés du bureau D'Anaheim, puis les employés du Bureau de Buffalo, puis les employés du bureau de Cleveland (A, B, c, compris, évidemment je ne sais pas où vous êtes).

dans ce cas, perdre le groupe par déclaration. Tout ce dont vous avez besoin est ORDER BY loc.LocationID

13
répondu ExactaBox 2012-12-22 03:55:58

fondamentalement, ce que cette erreur est en train de dire est que si vous allez utiliser la clause GROUP BY , alors votre résultat va être une relation/table avec une rangée pour chaque groupe, donc dans votre SELECT déclaration, vous pouvez seulement" sélectionner " la colonne que vous groupez par et utilisez des fonctions agrégées sur cette colonne parce que les autres colonnes n'apparaîtront pas dans le tableau résultant.

8
répondu Alex W 2012-12-22 03:54:50