1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Hilfe bei Abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von schalke, 22 Mai 2019.

  1. schalke

    schalke Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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=*#
    
     
  3. ukulele

    ukulele Datenbank-Guru

    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.
     
  4. schalke

    schalke Benutzer

    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
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Du solltest vor allem versuchen zu verstehen, daß das Tabellendesign schlecht ist. Du kannst z.B. nicht wirklich mit Datumswerten arbeiten.
     
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