Select case when mit unterschiedlichen Summen

Gimi27

Benutzer
Beiträge
12
Hallo zusammen,

ich bin dabei eine Auswertung über zwei Tabellen zu erstellen und komme nicht weiter und daher hoffe ich auf eure Hilfe.

Ausgangssituation:
Tabelle 1 hat die Felder [Schlüssel 1] und [Bezeichnung 1]
Tabelle 2 hat die Felder [Schlüssel 1], [Lfd-Nr], [KZ] und [Betrag]

[KZ] kann die Werte 1 bis 6 einnehmen. Für jede Kombination von [Schlüssel 1] und [KZ] können n Datensätze in Tabelle 2 existieren.

Ja nach [KZ] hat das Feld [Betrag] eine völlig andere Bedeutung, wobei auch noch verschiedene [KZ] kombiniert werden müssen.
Beispiel in einer NICHT korrekten SQL-Schreibweise: [Ergebnis 1] = sum(Betrag) where KZ=1 minus sum(Betrag) where KZ=6. Oder anderes ausgedrückt, diesmal in Textform: Um das [Ergebnis 1] je [Schlüssel 1] zu erlangen sollen alle Betragswerte addiert werden, bei denen KZ=1 und davon alle Betragswerte subtrahiert werden, bei denen KZ= 6 ist und dies natürlich für jeden Wert für [Schlüssel 1]. Neben [Ergebnis 1] gibt es noch zwei weitere logische "Ergebnisse" mit anderen Kombinationen von [KZ]-Werten. So ist z.B. [Ergebnis 2] = Sum(Betrag) where KZ = 2 minus sum(Betrag) where KZ=3 or KZ=4.

Ich hoffe ich habe mich verständlich ausgedrückt.

Im Ergebnis soll eine Tabelle mit den folgenden Spalten herauskommen:
[Schlüssel 1], [Bezeichnung 1], [Ergebnis 1], [Ergebnis 2], [Ergebnis 3]

Kann mir jemand bei meinem Problem helfen?

Vielen Dank
Michael
 
Werbung:
mal als Beispiel, einmal mit CASE und einmal mit FILTER, was ich noch schöner finde ...

Code:
test=*# select * from gimi27;
 id | kz | wert
----+----+------
  1 |  1 |   12
  2 |  1 |   27
  3 |  2 |   13
  4 |  3 |   55
  5 |  3 |   42
(5 rows)

test=*# select kz, case when kz=1 then sum(wert) end as summe_kz_1, sum(wert) filter (where kz=3) as summe_kz_3 from gimi27 group by kz;
 kz | summe_kz_1 | summe_kz_3
----+------------+------------
  1 |         39 |           
  3 |            |         97
  2 |            |           
(3 rows)

test=*#
 
Hallo akretschmer,

im Betreff habe ich ja schon mit select case when begonnen. Aber leider bin ich nicht weitergekommen.

Etwas wie z.B.

Select
[Schlüssel 1],
[Bezeichnung 1],
case
when [KZ] = 1 Then sum(Betrag),
when [KZ] = 6 then -sum(Betrag)
end

ist logisch nicht richtig. Es soll ja nicht entweder sum(Betrag) oder -sum(Betrag) ausgegeben werden, sondern zur Summe von Betrag für KZ=1 soll noch zusätzlich die Summe von Betrag für KZ=6 subtrahiert werden.

Ich bin mir eigentlich recht sicher, dass ich erst mal drei Ergebnismengen bilden muss mit jeweils dem Feld [Schlüssel 1] und dann dem [Ergebnis].

Aber wie bekommen ich diese Ergebnismenge hin? Hast du hierfür einen Tip?

Vielen Dank
Michael
 
Sorry, jetzt hatte ich schon geantwortet ohne den zweiten Teil deiner Antwort zu lesen.

Aber inhaltlich ist meine Antwort immer noch ungefähr gültig. Dein Select liefert nur die Summe für KZ=1 oder KZ=2, etc.

In deinem Beispiel würde ich aber gerne die 39 - 97 = -58 als Ergebnis haben :):)

Grüße
Michael
 
joa...

Code:
test=*# with temp as (select kz, case when kz=1 then sum(wert) end as summe_kz_1, sum(wert) filter (where kz=3) as summe_kz_3 from gimi27 group by kz) select sum(summe_kz_3) - sum(summe_kz_1) from temp;
 ?column?
----------
       58
(1 row)

so vielleicht?
 
Code:
test=*# with temp as (select kz, case when kz=1 then sum(wert) end as summe_kz_1, sum(wert) filter (where kz=3) as summe_kz_3 from gimi27 group by kz) select sum(summe_kz_1) - sum(summe_kz_3) from temp;
 ?column?
----------
      -58
(1 row)
 
Werbung:
An so etwas verschachteltes habe ich auch schon gedacht. Könnte klappen.

Werde es morgen ausprobieren. Jetzt muss ich weg.

Vielen Dank
Michael
 
Zurück
Oben