SQL Server Fehlermeldungen

  • InsideSQL.org home
  • Kontakt
  • Anmelden
  • « 507: Ungültiges Argument für SET ROWCOUNT.
  • 252: Der rekursive allgemeine Tabellenausdruck '%1!' enthält keinen UNION ALL-Operator »

8120: Die '%1!.%2!'-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregat

posted on Dez 2, 2010 von Frank Kalis in 8000-8999

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

Fabian
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?
21.11.11 @ 13:59

Kommentar von: Frank Kalis

Der Ausdruck "Jan2007" fehlt in der GROUP BY Klausel und müsste dort in der Form
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'
    ...    
22.11.11 @ 08:12


Formular wird geladen...

Kommentar-Feed für diesen Eintrag

Alle Blogs

  • =tg=
  • Andreas Wolter
  • Armin Neudert
  • Christoph Ingenhaag
  • cmu
  • Downloads
  • Falk Krahl
  • Fehlermeldungen
  • Frank Kalis
  • Holger Schmeling
  • InsideSQL.org Blogs
  • Klaus Oberdalhoff
  • Olaf Pietsch
  • Pressemitteilungen
  • Sascha Lorenz
  • tosc
  • Uwe Ricken
  • Weblinks

XML-Feeds

  • RSS 2.0: Einträge, Kommentare
  • Atom: Einträge, Kommentare
  • RDF: Einträge, Kommentare
  • RSS 0.92: Einträge, Kommentare
What is RSS?

©2025 by Frank Kalis • Kontakt • Hilfe • Website builder

Run your own website!