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.
| Print article | This entry was posted by Frank Kalis on 02.12.10 at 15:34:33 . Follow any responses to this post through RSS 2.0. |
21.11.11 @ 13:59:48
Hallo,
ich habe genau diesen Fehler wenn ich versuche folgenden Befehl auszuführen:
SELECT PPS.ARTIKEL.ARTIKELNR, PPS.ARTIKEL.BEZ1, PPS.ARTIKEL.BEZ2, CASE WHEN (CONVERT(CHAR(4),
PPS.RECHNUNG.RECHNDAT, 100) + CONVERT(CHAR(4), PPS.RECHNUNG.RECHNDAT, 120))
= 'Jan 2007' THEN SUM(PPS.BETRAUFTR.FERTIGMNG) ELSE 0 END AS Jan2007
FROM PPS.ARTIKEL INNER JOIN
PPS.BETRAUFTR INNER JOIN
PPS.AUFTRPOS ON PPS.BETRAUFTR.BEREICHID = PPS.AUFTRPOS.BEREICHID AND PPS.BETRAUFTR.AUFTRAGID = PPS.AUFTRPOS.AUFTRAGID AND
PPS.BETRAUFTR.AUFTRPOSID = PPS.AUFTRPOS.AUFTRPOSID AND PPS.BETRAUFTR.INSTITUTIONID = PPS.AUFTRPOS.INSTITUTIONID INNER JOIN
PPS.BA_STCKL ON PPS.BETRAUFTR.INSTITUTIONID = PPS.BA_STCKL.INSTITUTIONID AND
PPS.BETRAUFTR.BETRAUFTRAGID = PPS.BA_STCKL.BETRAUFTRAGID ON PPS.ARTIKEL.INSTITUTIONID = PPS.BA_STCKL.INSTITUTIONID AND
PPS.ARTIKEL.ARTIKELID = PPS.BA_STCKL.ARTIKELID LEFT OUTER JOIN
PPS.RECHNUNG RIGHT OUTER JOIN
PPS.AUFTRAG ON PPS.RECHNUNG.INSTITUTIONID = PPS.AUFTRAG.INSTITUTIONID AND
PPS.RECHNUNG.BEREICHID = PPS.AUFTRAG.BEREICHID AND PPS.RECHNUNG.AUFTRAGID = PPS.AUFTRAG.AUFTRAGID ON
PPS.AUFTRPOS.INSTITUTIONID = PPS.AUFTRAG.INSTITUTIONID AND PPS.AUFTRPOS.BEREICHID = PPS.AUFTRAG.BEREICHID AND
PPS.AUFTRPOS.AUFTRAGID = PPS.AUFTRAG.AUFTRAGID
WHERE (PPS.RECHNUNG.RECHNDAT IS NOT NULL) AND (PPS.BETRAUFTR.BEREICHID = 3) AND (LEFT(PPS.ARTIKEL.ARTIKELNR, 3) = '272')
group BY PPS.ARTIKEL.ARTIKELNR, PPS.ARTIKEL.BEZ1, PPS.ARTIKEL.BEZ2
ORDER BY PPS.ARTIKEL.ARTIKELNR
Hat einer eine Idee, was ich da falsch mache?
22.11.11 @ 08:12:28
Der Ausdruck "Jan2007" fehlt in der GROUP BY Klausel und müsste dort in der Form
wiederholt werden. Allerdings glaube ich Du suchst mehr etwas in dieser Form: