8120: Die '%1!.%2!'-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregat
Fehlermeldung:
Meldung 8120, Ebene 16, Status 1, Zeile 1
Die '%1!.%2!'-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Ebene:
16.
Beschreibung:
Diese Fehlermeldung erscheint, wenn man versucht eine Spalte in der SELECT Liste auszuführen, die nicht in einer Aggregatfunktion und nicht in der GROUP BY Klausel enthalten ist.
Auswirkungen:
Das SQL Statement kann zwar geparst werden, jedoch zur Laufzeit wird der Fehler ausgelöst.
Behebung:
Fehler der Ebene 16 sind Fehler, die vom Anwender hervorgerufen werden. Sie können und müssen vom Anwender korrigiert werden. Das Statement kann so nicht ausgeführt werden. Die Spalte muss entweder in einer Aggregatfunktion enthalten sein oder in der GROUP BY Klausel.
Versionen:
Alle Versionen von SQL Server.
Beispiele:
SELECT o.CustomerID, SUM(od.Quantity * (1 - od.Discount) * od.UnitPrice) AS Amount
FROM Northwind.dbo.Orders o
JOIN Northwind.dbo.[Order Details] od
ON o.OrderID = od.OrderID
Anmerkungen:
Im obigen Beispiel wird versucht die Spalte o.CustomerID in der SELECT Liste auszuweisen. Da diese weder in einer Aggregatfunktion enthalten ist, noch in einer GROUP BY Klausel vorkommt, wird der Fehler ausgelöst.
Die Fehlermeldung ist etwas irreführend, da man vermuten könnte, Spalten in der SELECT Liste müssten stets in einer Aggregatfunktion enthalten sein, was natürlich nicht der Fall ist. Da das Statement aber eine Aggregatfunktion mit SUM() verwendet, müssen sämtlichen anderen Spalten entweder ebenfals in einer solchen Funktion enthalten sein oder in der GROUP BY Klausel. So sind zum Beispiel beide folgenden Statements syntaktisch korrekt und liefern ein Ergebnis:
SELECT MIN(o.CustomerID), SUM(od.Quantity * (1 - od.Discount) * od.UnitPrice) AS Amount
FROM Northwind.dbo.Orders o
JOIN Northwind.dbo.[Order Details] od
ON o.OrderID = od.OrderID
und
SELECT o.CustomerID, SUM(od.Quantity * (1 - od.Discount) * od.UnitPrice) AS Amount
FROM Northwind.dbo.Orders o
JOIN Northwind.dbo.[Order Details] od
ON o.OrderID = od.OrderID
GROUP BY o.CustomerID
Auf der logischen Ebene aber macht nur das zweite Statement Sinn.
2 Kommentare
Kommentar von: Fabian
Kommentar von: Frank Kalis
CONVERT(CHAR(4), I2.InsertedDateTime, 100) + CONVERT(CHAR(4), I2.InsertedDateTime, 120)"wiederholt werden. Allerdings glaube ich Du suchst mehr etwas in dieser Form:
SELECT PPS.ARTIKEL.ARTIKELNR, PPS.ARTIKEL.BEZ1, PPS.ARTIKEL.BEZ2, SUM(PPS.BETRAUFTR.FERTIGMNG) AS Jan2007 FROM ... WHERE ... AND PPS.RECHNUNG.RECHNDAT >= '20070101' AND PPS.RECHNUNG.RECHNDAT <= '20070131' ...