Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Select case when mit unterschiedlichen Summen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Gimi27, 9 März 2020.

  1. Gimi27

    Gimi27 Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Du suchst CASE WHEN ...
     
  3. akretschmer

    akretschmer Datenbank-Guru

    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=*#
    
     
  4. Gimi27

    Gimi27 Benutzer

    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
     
  5. Gimi27

    Gimi27 Benutzer

    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
     
  6. akretschmer

    akretschmer Datenbank-Guru

    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?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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)
    
     
  8. Gimi27

    Gimi27 Benutzer

    An so etwas verschachteltes habe ich auch schon gedacht. Könnte klappen.

    Werde es morgen ausprobieren. Jetzt muss ich weg.

    Vielen Dank
    Michael
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden