Ergebnisse aus einer Abfrage addieren

Franz66

Benutzer
Beiträge
23
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
 
Werbung:
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:
Leider kriege ich es mit UNION nicht hin. Wie würde es aussehen? Danke sehr

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)
 
Werbung:
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)
 
Zurück
Oben