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

Inhalte fallweise in Spalten verschieben

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von derhenry, 30 September 2015.

  1. derhenry

    derhenry Aktiver Benutzer

    Hallo zusammen,

    ich habe eine Tabelle mit dieser Struktur:
    Jahr | System | Anzahl
    2010 | A | 10
    2011 | A | 8
    2012 | A | 7
    2013 | A | 6
    2010 | B | 5
    2011 | B | 9
    2012 | B | 10
    2013 | B | 9

    Und möchte gerne folgendes Ergebnis haben:
    Jahr | System A | System B
    2010 | 10 | 5
    2011 | 8 | 9
    2012 | 7 | 10
    2013 | 6 | 9

    Wie bekomme ich das mit SQL hin?
    Danke und Grüße
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from henry ;
     jahr | system | anzahl
    ------+--------+--------
     2010 | a  |  10
     2011 | a  |  8
     2012 | a  |  7
     2010 | b  |  5
     2011 | b  |  9
     2012 | b  |  10
     2013 | b  |  9
     2013 | a  |  6
    (8 rows)
    
    test=*# select jahr, sum(anzahl) filter (where system='a'), sum(anzahl) filter (where system='b') from henry group by jahr order by jahr;
     jahr | sum | sum
    ------+-----+-----
     2010 |  10 |  5
     2011 |  8 |  9
     2012 |  7 |  10
     2013 |  6 |  9
    (4 rows)
    
    Falls filter (...) nicht geht mit case when ... nachbauen.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    also so:

    Code:
    test=*# select jahr, sum(case when system='a' then anzahl else 0 end) as a, sum(case when system='b' then anzahl else 0 end) as b from henry group by jahr order by jahr;
     jahr | a  | b
    ------+----+----
     2010 | 10 |  5
     2011 |  8 |  9
     2012 |  7 | 10
     2013 |  6 |  9
    (4 rows)
    
     
  4. Distrilec

    Distrilec Datenbank-Guru

    Es gibt 3 gängige Methoden:
    1. Summieren von Case Whens pro Wert (hat @akretschmer schon gezeigt)
    2. Jeden Wert einzeln joinen und dann pro Wert summieren
    3. "Pivot"-Befehl... Hat noch nicht jede DB :)
     
  5. ukulele

    ukulele Datenbank-Guru

    UNION ALL und dann summieren ginge auch noch :)
     
  6. derhenry

    derhenry Aktiver Benutzer

    Hallo Leute,

    vielen Dank für die Antworten. Mit dem Case habe ich es jetzt hinbekommen.
    Das mit der Filter-Funktion kannte ich nicht. Pivot kann meine Datenbank nicht und den zweiten Weg vonDistrilec verstehe ich nicht. :)

    Grüße!
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Die Filter-Syntax ist SQL-Standard irgendwas, kann aber wohl derzeit nur PostgreSQL. Ich find's cool, weil gut lesbar.
     
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