Laden...

SQL Aggregatsfunktionen (SUM u. Group By)

Erstellt von LuckyStrike vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.231 Views
L
LuckyStrike Themenstarter:in
168 Beiträge seit 2008
vor 15 Jahren
SQL Aggregatsfunktionen (SUM u. Group By)

verwendetes Datenbanksystem: <Oracle 11g>

Hallo zusammen,

habe ein Problem mit SQL. Folgender Tabellenaufbau:

Kunde|Ort|Material|Menge|Einheit|Monat|Jahr

Aus dieser Tabelle würde ich gerne für jeden Monat die Menge jedes einzelnen KUnden ermitteln. Problem es gibt zwei schreibweisen bei den Einheiten, die zwar das selbe aussagen, aber trotzdem nicht gleich sein dürfen. Daher soll er die Einheit für die Gruppierung ignorieren, bei der Ausgabe aber trotzdem anzeigen, welche ist mir eigentlich egal.

Bisher stehe ich bei:

SELECT Kunde, Ort, Material, SUM(Menge), Einheit, Monat, Jahr FROM Tab WHERE (Monat = '02') AND (Jahr = '2008') 
GROUP BY Kunde, Ort, Material, Einheit, Monat, Jahr

Soweit funktioniert das auch, leider habe ich jetzt für die Einheit X und die Einheit Y einen Datensatz, diese solen aber auch zusammen gefasst werden. Habe es mit FIRST(Einheit) versucht, leider kommt dann eine Fehlermeldung ("Invalid identifier").

Wäre echt dankbar wenn einer ne Idee hätte ...

Gruß

D
496 Beiträge seit 2005
vor 15 Jahren

solange du einheit im select und group by stehen lässt kann das auch nicht funktionieren.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

L
LuckyStrike Themenstarter:in
168 Beiträge seit 2008
vor 15 Jahren

Aber aus dem Group By kann cih sie nicht rausnehmen. Und wenn ich sie ausdem Select rausnehme, dann wird sie auch nicht ausgegeben.

Oder was meinst du jetzt genau? Denn ich brauche "eine" passende Einheit zum Material, welche ist eigentlich egal.

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo LuckyStrike,

doch, es ist wie demondriver235 es sagt, die Aggregatfunktionen ("FIRST" ist auch eine) können nicht für die Gruppierung herangezogen werden.

Also kannst Du es einfach bei "GROUP BY" weglassen, dann sollte das gewünschte Ergebnis herauskommen.

Nochmal zur Veranschaulichung:

SELECT Kunde, Ort, Material, SUM(Menge), First(Einheit), Monat, Jahr FROM Tab WHERE (Monat = '02') AND (Jahr = '2008') 
GROUP BY Kunde, Ort, Material, Monat, Jahr

Hintergrunderklärung:
Stell Dir vor, was passiert bei so einer Abfrage: Eine Gruppierung bedeutet, dass er mehrere Teilergebnisse (hier z.B. alles was "Kunde Müller" ist) auf eine Ergebniszeile zusammenfasst, dazu muss er aber wissen, wie er die restlichen Spalten (hier z.B. Menge und Einheit) zusammenfassen soll. Hierzu gibst Du ihm die so genannten Aggregatfunktionen zur Hand, also für die Menge summiert er alle Ergebnisse zusammen, während er für die Einheit einfach den ersten Wert nimmt und den Rest ignoriert.
Es wird sehr schnell klar, warum dann auch eine Aggregatfunktion (z.B. "FIRST" nicht gleichzeitig mit einem "GROUP BY" verwendet werden kann.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

L
LuckyStrike Themenstarter:in
168 Beiträge seit 2008
vor 15 Jahren

Wusste nicht das die Antwort von demondriver auf das First bezogen war.

Problem ist, dass Oracle den First Befehl nicht akzeptiert.

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo LuckyStrike,

Oracle kann das ganz sicher, das ist SQL Standard und wird mit (fast) jeder SQL Datenbank unterstützt.

Siehe z.B. hier:
Oracle SQL Database Reference - FIRST AGGREGATE FUNCTION

Eventuell musst Du hier nur Groß/Kleinschreibung beachten, wobei ich solche Schlüsselwörter in SQL immer Groß schreiben würde.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”