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

Ergebnisse aus einer Abfrage addieren

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Franz66, 19 November 2014.

  1. Franz66

    Franz66 Benutzer

    Hallo

    Ich würde gerne die Ergebnisse aus einer Abfrage addieren.
    Hier den Code:

    select
    case
    when pk_status='Geschlossen' and abschlussgrund ='INV-Rente' then abschlussgrund
    when pk_status='Geschlossen' and abschlussgrund ='Eingegliedert' then abschlussgrund
    when pk_status='Abgelehnt' and abschlussgrund is NULL then pk_status
    else 'Andere' End as AG,
    count( case
    when pk_status='Geschlossen' and abschlussgrund ='INV-Rente' then abschlussgrund
    when pk_status='Geschlossen' and abschlussgrund ='Eingegliedert' then abschlussgrund
    when pk_status='Abgelehnt' and abschlussgrund is NULL then pk_status
    else 'Andere' End ) as Aanzahl

    from t_rep_03_all_hist_dev
    where issue_code='AUF' and abschlussdatum is not NULL
    group by
    case
    when pk_status='Geschlossen' and abschlussgrund ='INV-Rente' then abschlussgrund
    when pk_status='Geschlossen' and abschlussgrund ='Eingegliedert' then abschlussgrund
    when pk_status='Abgelehnt' and abschlussgrund is NULL then pk_status
    else 'Andere' End


    Mit dieser Abfrage kriege ich folgendes Resultat:

    "Eingegliedert";5071
    "Abgelehnt";175
    "INV-Rente";862
    "Andere";731


    und ich würde gerne noch eine Zeile mit dem "TOTAL 6839" haben.
    Hat jemand eine Idee?
    Danke
     
  2. Distrilec

    Distrilec Datenbank-Guru

    Sollte mit rollup funktionieren...
    Ich denke mal PostgreSQL wird das auch unterstützen.
    Auch wenn die Syntax anders sein kann :)
    Code:
    select
    case
    when pk_status='Geschlossen' and abschlussgrund ='INV-Rente' then abschlussgrund
    when pk_status='Geschlossen' and abschlussgrund ='Eingegliedert' then abschlussgrund
    when pk_status='Abgelehnt' and abschlussgrund is NULL then pk_status
    else 'Andere' End as AG,
    count( case
    when pk_status='Geschlossen' and abschlussgrund ='INV-Rente' then abschlussgrund
    when pk_status='Geschlossen' and abschlussgrund ='Eingegliedert' then abschlussgrund
    when pk_status='Abgelehnt' and abschlussgrund is NULL then pk_status
    else 'Andere' End ) as Aanzahl
    
    from t_rep_03_all_hist_dev
    where issue_code='AUF' and abschlussdatum is not NULL
    group by rollup(
    case
    when pk_status='Geschlossen' and abschlussgrund ='INV-Rente' then abschlussgrund
    when pk_status='Geschlossen' and abschlussgrund ='Eingegliedert' then abschlussgrund
    when pk_status='Abgelehnt' and abschlussgrund is NULL then pk_status
    else 'Andere' End
    )
     
    Zuletzt bearbeitet: 19 November 2014
  3. akretschmer

    akretschmer Datenbank-Guru

    Leider noch Zukunftsmusik, kommt aber. Bis dahin ginge das mit einem Union.

    Mein Freund David Fetter hat heute dazu was veröffentlicht: http://de.slideshare.net/davidfetter/grouping-sets-sfpug20141118
     
  4. Franz66

    Franz66 Benutzer

    Leider kriege ich es mit UNION nicht hin. Wie würde es aussehen? Danke sehr
     
  5. akretschmer

    akretschmer Datenbank-Guru

    ganz simples Beispiel:

    Code:
    test=*# select * from foo;
      datum  | val
    ------------+-----
     2014-10-28 |  2
     2014-10-28 |  3
     2014-10-29 |  1
     2014-10-29 |  2
     2014-10-29 |  12
     2014-10-30 |  12
    (6 rows)
    
    Time: 58,389 ms
    test=*# select datum::text, sum(val) from foo group by datum union select 'Summe', sum(val) from foo;
      datum  | sum
    ------------+-----
     2014-10-29 |  15
     2014-10-30 |  12
     2014-10-28 |  5
     Summe  |  32
    (4 rows)
    
     
    Franz66 und Walter gefällt das.
  6. Franz66

    Franz66 Benutzer

    Vieeeeeeeelen DANK!!!! Es hat geklappt!!!!
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Bitte ;-)

    Folgende Version könnte bei großen Tabellen schneller sein:

    Code:
    test=*# with zwischensumme as (select datum::text, sum(val) from foo group by datum ) select * from zwischensumme union all select 'Summe', sum(sum) from zwischensumme;
      datum  | sum
    ------------+-----
     2014-10-28 |  5
     2014-10-29 |  15
     2014-10-30 |  12
     Summe  |  32
    (4 rows)
    
    Hier wird nicht noch einmal durch die ganze Tabelle gegangen, um die komplette Summe zu berechnen, sondern 'nur noch' durch die bereits aggregierten Werte.
    Aufpassen muß man übrigens mit dem UNION: wenn man das ALL wegläßt nutzt PG einen Hash, um Dubletten auszuschließen. Das hat aber zur Folge, daß die bisherige Sortierung flöten geht:

    Code:
    test=*# with zwischensumme as (select datum::text, sum(val) from foo group by datum ) select * from zwischensumme union select 'Summe', sum(sum) from zwischensumme;
      datum  | sum
    ------------+-----
     2014-10-30 |  12
     Summe  |  32
     2014-10-28 |  5
     2014-10-29 |  15
    (4 rows)
    
    Genau genommen könnte das bei der ersten Version, also mit UNION ALL auch passieren, z.B. wenn sich die interne Realisierung des UNION ALL mal ändert. Wenn man eine exakte Reihenfolge der Tupel im Resultat will, sollte man dies erzwingen mit einem ORDER BY, z.B. so:

    Code:
    test=*# with zwischensumme as (select datum::text, sum(val),0::int as o from foo group by datum ) select datum, sum, 0 as o from zwischensumme union select 'Summe', sum(sum), 1 from zwischensumme order by o;
      datum  | sum | o
    ------------+-----+---
     2014-10-28 |  5 | 0
     2014-10-29 |  15 | 0
     2014-10-30 |  12 | 0
     Summe  |  32 | 1
    (4 rows)
    
     
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