[SQL] Zeilen zusammenfassen

UnBreakable

Lt. Junior Grade
Registriert
Sep. 2005
Beiträge
453
Hallo,

ich habe folgendes Problem in SQL, evt. kann mir ja wer weiterhelfen:

Ich habe eine Tabelle die so aufgebaut ist (Spalten):

Artikel, Lager, Gasse, Anzahl
1, 40, 1, 12
1, 40, 2, 3
1, 30, 1, 3
usw.

ich will nun für jede Gasse eine extra Spalte haben.
Das hab ich so gelöst:

select
Artikel,
Lager,
case when gasse = '1' then sum(anzahl) end as 'Gasse 1',
case when gasse = '2' then sum(anzahl) end as 'Gasse 2',
case when gasse = '3' then sum(anzahl) end as 'Gasse 3',
case when gasse = '4' then sum(anzahl) end as 'Gasse 4'
from bestand
group by artikel, lager, gasse, anzahl

Das funktioniert auch soweit, allerdings besteht folgendes Problem:
Ich bekomm folgendes Ergebnis (Spalten):

Artikel, Lager, Gasse 1, Gasse 2, Gasse 3, Gasse 4
1, 40, 12, NULL, NULL, NULL, NULL
1, 40, NULL, 3, NULL, NULL
1, 30, 3, NULL, NUL, NULL

soweit in Ordnung, ich will aber jetzt praktisch die Spalten so zusammenfassen das ich folgendes Ergebnis bekomme:

Artikel, Lager, Gasse 1, Gasse 2, Gasse 3, Gasse 4
1, 40, 12, 3, NULL, NULL
1, 30, 3, NULL, NUL, NULL

wäre super wenn mir jemand weiterhelfen könnte.
Ich habe den Befehl compute probiert aber irgendwie klappt das nicht. (Kenn auch den Syntax nicht so gut bzw. hab noch nie damit gearbeitet evt. klappt das mit dem auch nicht)

Ich hoffe es ist einigermaßen verständlich, ich weiß nicht wie ich es schöner erklären könnte...

Danke schonmal!
 
Das Group By nach Anzahl sollte im ersten Select doch überflüssig sein?

Mir würde das hier einfallen (ungetestet), vermutlich geht's aber besser.
Code:
SELECT Artikel, Lager, Sum(Gasse1), Sum(Gasse2), Sum(Gasse3), Sum(Gasse4)
FROM (
  select
  Artikel,
  Lager,
  case when gasse = '1' then sum(anzahl) end as 'Gasse1',
  case when gasse = '2' then sum(anzahl) end as 'Gasse2',
  case when gasse = '3' then sum(anzahl) end as 'Gasse3',
  case when gasse = '4' then sum(anzahl) end as 'Gasse4'
  from bestand
  group by artikel, lager, gasse )
GROUP BY Artikel, Lager;

Edit: Wenn du das GroupBy nach Gasse und Anzahl entfernst, sollte es dann nicht schon das machen was du willst? Kann's selber gerade nicht testen. Allerdings sieht diese Vorgehensweise nicht so sehr optimal aus, muss ich sagen. Was hast du denn vor? Oder brauchst du diese Abfrage auf Teufel-komm-raus?
 
Zuletzt bearbeitet:
Ja, stimmt, das group by nach der anzahl ist überflüssig!

Also ich denke mal das sieht schonmal ganz gut aus.
Nur bekomm ich einen Syntax Error:

Falsche Syntax in der Nähe des GROUP-Schlüsselwortes.

wenn ich folgendes ausführe funktioniert das ganze:

Code:
  select
  Artikel,
  Lager,
  case when gasse = '1' then sum(anzahl) end as 'Gasse1',
  case when gasse = '2' then sum(anzahl) end as 'Gasse2',
  case when gasse = '3' then sum(anzahl) end as 'Gasse3',
  case when gasse = '4' then sum(anzahl) end as 'Gasse4'
  from bestand
  group by artikel, lager, gasse

bekomm aber natürlich das gleiche ergebnis...

Ich kann mir aber nicht erklären wo der Syntax error herkommt O_o
 
Vielleicht funktiooniert auch so was hier:
Code:
select
  Artikel,
  Lager,
  sum(anzahl) AS concat('Gasse', cast(gasse AS CHAR))
  from bestand
group by artikel, lager, gasse
Ich kann es jetzt mangels MySQL grade nicht testen.
 
Einmal die geliebte Kreuztabelle (hinreichend aktuelle MySQL-Version vorausgesetz).
Musst also nur Aggregat-Funktion außerhalb des "CASE" schreiben.
Code:
SELECT Artikel, Lager,
SUM( CASE gasse WHEN '1' THEN anzahl END ) as gasse1,
SUM( CASE gasse WHEN '2' THEN anzahl END ) as gasse2,
SUM( CASE gasse WHEN '3' THEN anzahl END ) as gasse3,
SUM( CASE gasse WHEN '4' THEN anzahl END ) as gasse4

FROM bestand

GROUP BY Artikel, Lager
 
Ich glaub ich hab den fehler gefunden:
Folgender Code funktioniert:

(ich hab nur das gasse bei group by weggelassen und das Sum vorangestellt....)

Code:
  select
  Artikel,
  Lager,
   sum(case when gasse = '1' then anzahl end) as 'Gasse1',
   sum(case when gasse = '2' then anzahl end) as 'Gasse2',
   sum(case when gasse = '3' then anzahl end) as 'Gasse3',
   sum(case when gasse = '4' then anzahl end) as 'Gasse4'
  from bestand
  group by artikel, lager

Danke für eure hilfe!!
 
Zurück
Oben