Hilfe bei Abfrage

schalke

Benutzer
Beiträge
14
Hallo,
leider konnte ich keinen aussagkräftigeren Titel finden, sorry.

Ich habe hier von einem Dienstplanprogramm eine (für mich) total bescheuerte Tabelle erhalten, aus der ich etwas aussagekräftiges herauskitzeln soll.

Die Tabelle besteht aus Spalten für Name, Monat, Jahr, [paar Felder Zusatzinfo] und eine Spalte für jeden Tag im Monat, also bis Tag 31 - Im Bsp. sind nicht alle aufgeführt
Code:
|Name|Monat|Jahr|Tag01|Tag02|Tag03|Tag04|Tag05|Tag06|Tag07|
|MA01|5    |2019|TF1  |TF2  |TTD  |TF2  |     |TN1  |TN2  |
|MA02|5    |2019|TF2  |TF1  |TN1  |     |TTD  |TN2  |     |
|MA03|5    |2019|TDD  |     |TF1  |TTD  |     |TF2  |TN1  |
|MA04|5    |2019|TN1  |TN2  |     |     |TF1  |     |TF2  |
|MA05|5    |2019|TN2  |TN1  |     |TN1  |TN1  |TF1  |TTD  |
|MA06|5    |2019|     |     |TN2  |TF1  |TN2  |     |     |
|MA07|5    |2019|     |TTD  |TF2  |TN2  |TF2  |TTD  |TF1  |

Es stehen also in den Tagsspalten die Schichten des Mitarbeites, dessn Name in Spalte 1 steht. Ausserdem in den Spalten 2 und 3 der Monat und das Jahr

Ich möchte hier nun eine Abfrage, die folgendes Ergebnis liefert (für alle 31 Tage):

Code:
|Schicht|Tag01|Tag02|Tag03|Tag04|Tag05|Tag06|Tag07|
|TF1    |MA01 |MA02 |MA03 |MA06 |MA04 |MA05 |MA07 |
|TF2    |MA02 |MA01 |MA07 |MA01 |MA07 |MA03 |MA04 |
|TTD    |MA03 |MA03 |MA01 |MA03 |MA02 |MA07 |MA05 |
|TN1    |MA04 |MA05 |MA02 |MA05 |MA05 |MA01 |MA03 |
|TN2    |MA05 |MA07 |MA06 |MA07 |MA06 |MA02 |MA01 |

Es gibt noch einige Schichten und Mitarbeiter mehr, außerdem natürlich auch alle Monate und mindestens zwei komplette Jahre.

Wer hat mir hier einen Tipp?

Danke vorab
Michael
 
Werbung:
Mit Deinen Daten:

Code:
test=*# select * from schalke order by name;
 name | t01 | t02 | t03 | t04 | t05 | t06 | t07
------+-----+-----+-----+-----+-----+-----+-----
 ma01 | tf1 | tf2 | ttd | tf2 |     | tn1 | tn2
 ma02 | tf2 | tf1 | tn1 |     | ttd | tn2 |
 ma03 | tdd |     | tf1 | ttd |     | tf2 | tn1
 ma04 | tn1 | tn2 |     |     | tf1 |     | tf2
 ma05 | tn2 | tn1 |     | tn1 | tn1 | tf1 | ttd
 ma06 |     |     | tn2 | tf1 | tn2 |     |
 ma07 |     | ttd | tf2 | tn2 | tf2 | ttd | tf1
(7 rows)

komme ich auf:

Code:
test=*# with schicht as (select t01 as schicht from schalke union select t02 from schalke union select t03 from schalke union select t04 from schalke union select t05 from schalke union select t06 from schalke union select t07 from schalke) select schicht, s1.name as tag1, s2.name as tag2, s3.name as tag3, s4.name as tag4, s5.name as tag5, s6.name as tag6, s7.name as tag7 from schicht left join schalke s1 on s1.t01=schicht.schicht left join schalke s2 on s2.t02=schicht.schicht left join schalke s3 on s3.t03=schicht.schicht left join schalke s4 on s4.t04=schicht.schicht left join schalke s5 on s5.t05=schicht.schicht left join schalke s6 on s6.t06=schicht.schicht left join schalke s7 on s7.t07=schicht.schicht where schicht is not null order by case when schicht = 'tf1' then 1 when schicht = 'tf2' then 2 when schicht = 'ttd' then 3 when schicht = 'tn1' then 4 when schicht = 'tn2' then 5 end;
 schicht | tag1 | tag2 | tag3 | tag4 | tag5 | tag6 | tag7
---------+------+------+------+------+------+------+------
 tf1     | ma01 | ma02 | ma03 | ma06 | ma04 | ma05 | ma07
 tf2     | ma02 | ma01 | ma07 | ma01 | ma07 | ma03 | ma04
 ttd     |      | ma07 | ma01 | ma03 | ma02 | ma07 | ma05
 tn1     | ma04 | ma05 | ma02 | ma05 | ma05 | ma01 | ma03
 tn2     | ma05 | ma04 | ma06 | ma07 | ma06 | ma02 | ma01
 tdd     | ma03 |      |      |      |      |      |
(6 rows)

test=*#

Sieht fast wie Dein Wunsch aus, entweder hast Du da einen Fehler oder ich mich irgendwo vertippt. Vermutlich Du bei ma03 und Tag1:

Code:
test=# update schalke set t01 = 'ttd' where name = 'ma03';                                                                                                                                                           
UPDATE 1
test=*# with schicht as (select t01 as schicht from schalke union select t02 from schalke union select t03 from schalke union select t04 from schalke union select t05 from schalke union select t06 from schalke union select t07 from schalke) select schicht, s1.name as tag1, s2.name as tag2, s3.name as tag3, s4.name as tag4, s5.name as tag5, s6.name as tag6, s7.name as tag7 from schicht left join schalke s1 on s1.t01=schicht.schicht left join schalke s2 on s2.t02=schicht.schicht left join schalke s3 on s3.t03=schicht.schicht left join schalke s4 on s4.t04=schicht.schicht left join schalke s5 on s5.t05=schicht.schicht left join schalke s6 on s6.t06=schicht.schicht left join schalke s7 on s7.t07=schicht.schicht where schicht is not null order by case when schicht = 'tf1' then 1 when schicht = 'tf2' then 2 when schicht = 'ttd' then 3 when schicht = 'tn1' then 4 when schicht = 'tn2' then 5 end;
 schicht | tag1 | tag2 | tag3 | tag4 | tag5 | tag6 | tag7
---------+------+------+------+------+------+------+------
 tf1     | ma01 | ma02 | ma03 | ma06 | ma04 | ma05 | ma07
 tf2     | ma02 | ma01 | ma07 | ma01 | ma07 | ma03 | ma04
 ttd     | ma03 | ma07 | ma01 | ma03 | ma02 | ma07 | ma05
 tn1     | ma04 | ma05 | ma02 | ma05 | ma05 | ma01 | ma03
 tn2     | ma05 | ma04 | ma06 | ma07 | ma06 | ma02 | ma01
(5 rows)

test=*#
 
Akretschmer zeigt wie es mit simplen Mitteln geht, das sind natürlich bei 31 Tagen ne Menge Joins.

Die Daten die dir vorliegen befinden sich in einer Pivot-Tabelle. Jetzt könntest du mit UNPIVOT die Daten wieder zu sinnvollen Datensätzen formen allerdings willst du als Ergebnis auch wieder ein PIVOT haben, das könnte eklig werden. Eine wirklich elegante Lösung gibts da nicht, viele Joins sind einfacher zu verstehen und handhaben.
 
Halo,

ja, da hab ich mich vertippt.
Wenn das Ergebnis aber so ist, passt das. Ich passe das jetzt mal auf meine Tabellen an und versuche das zu verstehen ;-)

Vielen Dank erstmal

Grüße
Michael
 
Werbung:
Zurück
Oben