374 Stimmen

Grund für Spalte ist in der Auswahlliste ungültig, da sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist

Ich habe eine Fehlermeldung erhalten.

Die Spalte 'Employee.EmpID' ist in der Auswahlliste ungültig, weil sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist.


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

Diese Situation passt zu der von Bill Karwin gegebenen Antwort.

Korrektur für oben, passt zur Antwort von 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 

URSPRÜNGLICHE FRAGE -

Für die SQL-Abfrage -

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

Ich verstehe nicht, warum ich diese Fehlermeldung erhalte. Ich möchte nur die Tabellen verbinden und dann alle Mitarbeiter an einem bestimmten Standort zusammenfassen.

Ich glaube, ich habe eine teilweise Erklärung für meine eigene Frage. Sagen Sie mir, ob das in Ordnung ist -

Um alle Mitarbeiter zu gruppieren, die am gleichen Standort arbeiten, müssen wir zunächst die Standort-ID angeben.

Dann können/werden wir nicht jede Mitarbeiter-ID daneben erwähnen. Stattdessen geben wir die Gesamtzahl der Mitarbeiter an diesem Standort an, d. h. wir sollten die Mitarbeiter, die an diesem Standort arbeiten, SUMMEN(). Warum wir das so machen, weiß ich nicht genau. Dies erklärt also den Teil des Fehlers, der besagt, dass er nicht in einer Aggregatfunktion enthalten ist.

Was ist die Erklärung für die GROUP BY Klausel Teil des Fehlers?

721voto

Bill Karwin Punkte 493880

Angenommen, ich habe die folgende Tabelle T :

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

Und ich mache die folgende Abfrage:

SELECT a, b
FROM T
GROUP BY a

Die Ausgabe sollte zwei Zeilen enthalten, eine Zeile, in der a=1 und eine zweite Reihe, in der a=2 .

Aber was sollte der Wert von b in jeder dieser beiden Zeilen anzeigen? In jedem Fall gibt es drei Möglichkeiten, und nichts in der Abfrage macht deutlich, welcher Wert für b in jeder Gruppe zu wählen ist. Es ist mehrdeutig.

Dies zeigt, dass die Einwertregel Dies verhindert die undefinierten Ergebnisse, die Sie erhalten, wenn Sie eine GROUP BY-Abfrage ausführen und alle Spalten in die Auswahlliste aufnehmen, die weder Teil der Gruppierungskriterien sind noch in Aggregatfunktionen (SUM, MIN, MAX usw.) erscheinen.

Die Behebung könnte folgendermaßen aussehen:

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

Jetzt ist klar, dass Sie das folgende Ergebnis wollen:

a   x
--------
1   ghi
2   pqr

98voto

John Woo Punkte 249233

Ihre Abfrage wird funktionieren in MYSQL wenn Sie die Funktion deaktivieren ONLY_FULL_GROUP_BY Serverbetrieb ( und standardmäßig ist es ). In diesem Fall verwenden Sie jedoch ein anderes RDBMS. Damit Ihre Abfrage funktioniert, alle nicht-aggregierten Spalten hinzufügen zu Ihrem GROUP BY Klausel, z.B.

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

Nicht-aggregierte Spalten bedeutet, dass die Spalte nicht in aggregierte Funktionen wie SUM , MAX , COUNT , usw..

21voto

ExactaBox Punkte 3193

"Ich möchte nur die Tabellen verbinden und dann alle Mitarbeiter an einem bestimmten Standort zusammenfassen."

Es hört sich so an, als ob Sie möchten, dass die Ausgabe der SQL-Anweisung alle Mitarbeiter des Unternehmens auflistet, aber zuerst alle Mitarbeiter des Büros in Anaheim, dann die Mitarbeiter des Büros in Buffalo, dann die Mitarbeiter des Büros in Cleveland (A, B, C, verstehen Sie, ich weiß natürlich nicht, welche Standorte Sie haben).

In diesem Fall verlieren Sie die GROUP BY-Anweisung. Alles was Sie brauchen ist ORDER BY loc.LocationID

19voto

Alex W Punkte 34972

Im Grunde besagt dieser Fehler, dass Sie, wenn Sie die GROUP BY Klausel, dann wird Ihr Ergebnis eine Beziehung/Tabelle mit einer Zeile für jede Gruppe sein, so dass in Ihrer SELECT Anweisung können Sie nur die Spalte "auswählen", nach der Sie gruppieren, und Aggregatfunktionen für diese Spalte verwenden, da die anderen Spalten nicht in der Ergebnistabelle erscheinen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X