count und case when ??

kindlicherkaiser

Benutzer
Beiträge
10
Hallo liebe Forums/Gemeinde,

ich habe folgende Tabelle Abfahrt mit den Spalten Tag und Zeit.

Tag Zeit
09.05.2017 8:00
09.05.2017 15:00
10.05.2017 8:00
10.05.2017 9:00
11.05.2017 8:00

1. Alle Zeiten sollen durch Frueh (8 Uhr bis 12 Uhr) und Spaet (12 Uhr bis 24 Uhr) ersetzt werden.
2. Es soll eine neue Spalte geben, die die Anzahl der fruehen bzw. spaeten Abfahrten pro Tag anzeigt.
3. Am 11.05.2017 gibt es nur eine Abfahrt frueh. Fuer die spaete Abfahrt soll eine neue Zeile eingefuegt werden mit Anzahl 0.

Das Ergebnis soll wie folgt aussehen

Tag Zeit Anzahl
09.05.2017 frueh 1
09.05.2017 spaet 1
10.05.2017 frueh 2
10.05.2017 spaet 0
11.05.2017 frueh 1
11.05.2017 spaet 0


Waere super, wenn mir jemand helfen koennte!

Vielen lieben Dank schonmal!
Euer kindlicherkaiser
 
Werbung:
Mit Deiner Tabelle und einer Hilfstabelle:

Code:
test=*# select * from kindlicherkaiser ;
  tag  |  zeit   
------------+----------
 2017-05-09 | 08:00:00
 2017-05-09 | 15:00:00
 2017-05-10 | 08:00:00
 2017-05-10 | 09:00:00
 2017-05-11 | 08:00:00
(5 Zeilen)

test=*# select * from zeiten ;
  zeit  | name  
---------------------+-------
 [08:00:00,12:00:00) | frueh
 [12:00:00,24:00:00) | spaet
(2 Zeilen)

Die Lösung:

Code:
test=*# select tag, name, sum(case when schicht @> zeit then 1 else 0 end) as anzahl from (select k.tag, k.zeit, z.zeit as schicht, z.name from kindlicherkaiser k cross join zeiten z) foo group by tag, name;
  tag  | name  | anzahl
------------+-------+--------
 2017-05-09 | frueh |  1
 2017-05-09 | spaet |  1
 2017-05-10 | frueh |  2
 2017-05-10 | spaet |  0
 2017-05-11 | frueh |  1
 2017-05-11 | spaet |  0
(6 Zeilen)

PostgreSQL & Range-Typen in ihrer Anwendung. Ohne ginge das auch, wird aber komplexer.
 
Zurück
Oben