SQL GROUP BY Statement anscheinend fehlerhaft

sql-schüler

Cadet 2nd Year
Registriert
Juli 2021
Beiträge
16
Hallo zusammen :)

ich benötige Hilfe bei folgender Abfrage, die mir zur Feststellung der verkauften Menge dienen soll:

SQL:
SELECT Artikelname, Artikelvariante, SUM(Menge) verkaufteMenge
FROM (SELECT bom.Artikelname, bom.Artikelvariante, AVG(IFNULL(e.Menge, 0) / bom.Menge) Menge
      FROM BOMTabelle bom
      LEFT JOIN EreignisTabelle e ON e.Artikelname = bom.Artikelname
                                 AND e.Artikelvariante = bom.Artikelvariante
                                 AND e.Artikelbestandteile = bom.Artikelbestandteile
      GROUP BY e.Artikelname, e.Artikelvariante, e.EreignisID)
GROUP BY Artikelname, Artikelvariante

Die Logik hinter dieser Query erschließt sich mir bereits, nun frage ich mich jedoch wie das GROUP BY Statement geschrieben werden sollte. Muss es nicht alle Spalten enthalten die im SELECT vorkommen?
Beim Ausführen der Abfrage erhalte ich folgende Meldung: "Incorrect syntax near the keyword 'GROUP'." in Zeile 8.

Vielen Dank schon mal für eure Antworten!
 
Du musst nur die Spalten in die Group By Anweisung schreiben, die du nicht zählen, summieren, etc. willst. Ich vermute, dass du in der Zeile 7 ein " as x" oder so ergänzen musst. Das "as x" ist ein Alias für das Subquery dass du aufrufst.

SQL:
SELECT Artikelname, Artikelvariante, SUM(Menge) verkaufteMenge
FROM (SELECT bom.Artikelname, bom.Artikelvariante, AVG(IFNULL(e.Menge, 0) / bom.Menge) Menge
      FROM BOMTabelle bom
      LEFT JOIN EreignisTabelle e ON e.Artikelname = bom.Artikelname
                                 AND e.Artikelvariante = bom.Artikelvariante
                                 AND e.Artikelbestandteile = bom.Artikelbestandteile
      GROUP BY e.Artikelname, e.Artikelvariante, e.EreignisID) as x
GROUP BY Artikelname, Artikelvariante
 
  • Gefällt mir
Reaktionen: SomeDifferent
Evtl. auch problematisch:

"group by e.EreignisID" obwohl e.EreignisID kein Bestandteil der gewählten Spalten ist.
 
@X__ Sollte meines Wissens nichts ausmachen. Wenigstens in SQL Server nicht :-). Bei Maria/MySQL meine ich auch nicht, dass es dort stört.
 
Und welche SQL Engine läuft da? Ein MySQL würde dir das um die Ohren hauen, weil dort jede abgeleitete Tabelle ihren eigenen Alias benötigt.
SQL:
SELECT Artikelname, Artikelvariante, SUM(Menge) verkaufteMenge
FROM (SELECT bom.Artikelname, bom.Artikelvariante, AVG(IFNULL(e.Menge, 0) / bom.Menge) Menge
      FROM BOMTabelle bom
      LEFT JOIN EreignisTabelle e ON e.Artikelname = bom.Artikelname
                                 AND e.Artikelvariante = bom.Artikelvariante
                                 AND e.Artikelbestandteile = bom.Artikelbestandteile
      GROUP BY e.Artikelname, e.Artikelvariante, e.EreignisID) d
GROUP BY Artikelname, Artikelvariante
 
Nebuk schrieb:
Du musst nur die Spalten in die Group By Anweisung schreiben, die du nicht zählen, summieren, etc. willst. Ich vermute, dass du in der Zeile 7 ein " as x" oder so ergänzen musst. Das "as x" ist ein Alias für das Subquery dass du aufrufst.

Bekomme nun folgende Fehlermeldung:

in Zeile 2:
Column 'bom.Artikelname' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Yuuri schrieb:
Und welche SQL Engine läuft da? Ein MySQL würde dir das um die Ohren hauen, weil dort jede abgeleitete Tabelle ihren eigenen Alias benötigt.

Benutze hierfür MS SQL Server Management Studio und im Anschluss wenn die Query funktioniert, wollte ich das in den Power Bi Report Builder übertragen :D
 
Das ist einfach, guckst du:

SELECT Artikelname, Artikelvariante, SUM(Menge) verkaufteMenge
FROM (SELECT bom.Artikelname, bom.Artikelvariante, AVG(IFNULL(e.Menge, 0) / bom.Menge) Menge
FROM BOMTabelle bom
LEFT JOIN EreignisTabelle e ON e.Artikelname = bom.Artikelname
AND e.Artikelvariante = bom.Artikelvariante
AND e.Artikelbestandteile = bom.Artikelbestandteile
GROUP BY e.Artikelname, e.Artikelvariante, e.EreignisID)test
GROUP BY Artikelname, Artikelvariante

Du must vor dem Letzten Group einen Alias für deinen Select angeben.
 
sql-schüler schrieb:
Column 'bom.Artikelname' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Schreib im Select mal e.Artikelname (auch bei der anderen Spalte auf e referenzieren) denn du Gruppierst über die Spalten in Tabelle e, selektierst dann aber aus bom.
 
Jesterfox schrieb:
Schreib im Select mal e.Artikelname (auch bei der anderen Spalte auf e referenzieren) denn du Gruppierst über die Spalten in Tabelle e, selektierst dann aber aus bom.
SQL:
SELECT e.Artikelname, e.Artikelvariante, SUM(Menge) verkaufteMenge
FROM (SELECT bom.Artikelname, bom.Artikelvariante, AVG(IFNULL(e.Menge, 0) / bom.Menge) Menge
      FROM bom
      LEFT JOIN e ON e.Artikelname = bom.Artikelname
                 AND e.Artikelvariante = bom.Artikelvariante
                 AND e.Artikelbestandteile = bom.Artikelbestandteile
      GROUP BY e.Artikelname, e.Artikelvariante, e.EreignisID) AS x
GROUP BY Artikelname, Artikelvariante

Hab das geändert, doch leider erhalte ich dieselbe Fehlermeldung + 2 zusätzliche Fehlermeldungen:

in Zeile 1 :

The multi-part identifier "e.Artikelname" could not be bound.
+
The multi-part identifier "e.Artikelvariante" could not be bound.
 
Wie kannst du denn e.Artikelname in Zeile 1 selecten aus einem Subselect, der nur bom.Artikelname hat und selber x als alias hat?
Am besten guckst du mal in einem SQL Editor wie das Ergebnis des Subselects überhaupt aussieht.
Einmal mit x als alias und einmal ohne.
 
Du hast es an der falschen Stelle geändert... das muss in der zweiten Zeile e.Artikelname und e.Artikelvariante heißen anstelle von bom.Artikelname und bom.Artikevariante.

In der ersten Zeile kannst du das e. weglassen oder durch ein x. ersetzen (als verweis auf den Subselect der mit AS x ja so benannt wurde)
 
sql-schüler schrieb:
sql-schüler schrieb:
The multi-part identifier "e.Artikelname" could not be bound.
+
The multi-part identifier "e.Artikelvariante" could not be bound.
Na, wenn Du Deinen Query kaputtreparierst musst Du Dich nicht wundern.
Also:
SQL:
SELECT e.Artikelname, e.Artikelvariante, SUM(Menge) verkaufteMenge
FROM (SELECT bom.Artikelname, bom.Artikelvariante, AVG(IFNULL(e.Menge, 0) / bom.Menge) Menge
      FROM bom
      LEFT JOIN EreignisTabelle e ON e.Artikelname = bom.Artikelname
                 AND e.Artikelvariante = bom.Artikelvariante
                 AND e.Artikelbestandteile = bom.Artikelbestandteile
      GROUP BY e.Artikelname, e.Artikelvariante, e.EreignisID) AS x
GROUP BY Artikelname, Artikelvariante

@bulli008 : Bitte Code-Tags verwenden, in einem proportionalen Font ist so ein Query wirklich schlecht lesbar.
 
@Phrasendreher : so passts aber auch nicht...

So müsste es passen:
SQL:
SELECT x.Artikelname, x.Artikelvariante, SUM(Menge) verkaufteMenge
FROM (SELECT e.Artikelname, e.Artikelvariante, AVG(IFNULL(e.Menge, 0) / bom.Menge) Menge
      FROM BOMTabelle bom
      LEFT JOIN EreignisTabelle e ON e.Artikelname = bom.Artikelname
                 AND e.Artikelvariante = bom.Artikelvariante
                 AND e.Artikelbestandteile = bom.Artikelbestandteile
      GROUP BY e.Artikelname, e.Artikelvariante, e.EreignisID) AS x
GROUP BY Artikelname, Artikelvariante
 
Wenn wir schonmal dabei sind...

SQL:
SELECT x.Artikelname, x.Artikelvariante, SUM(x.Menge) verkaufteMenge
FROM (SELECT e.Artikelname, e.Artikelvariante, AVG(IFNULL(e.Menge, 0) / bom.Menge) Menge
      FROM BOMTabelle bom
      LEFT JOIN EreignisTabelle e ON e.Artikelname = bom.Artikelname
                 AND e.Artikelvariante = bom.Artikelvariante
                 AND e.Artikelbestandteile = bom.Artikelbestandteile
      GROUP BY e.Artikelname, e.Artikelvariante, e.EreignisID) AS x
GROUP BY x.Artikelname, x.Artikelvariante
 
  • Gefällt mir
Reaktionen: Jesterfox
Jo, stimmt. Gab noch ein paar Stellen wo es nicht sauber durchgezogen war. Wobei es an den meisten Stellen egal ist. Wichtig ist eben nur in der 2. Zeile beim Select die gleiche Bezeichung zu nehmen wie in Zeile 7 beim Group By, ansonsten checkt dass der SQL Server nicht dass das die selben Felder sind und wirft eben diese Fehlermeldung aus.
 
Zurück
Oben