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

Zeilen als Spalten, Full Outer Join?

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Thomas Bauer, 2 Oktober 2013.

  1. Thomas Bauer

    Thomas Bauer Neuer Benutzer

    Hallo,

    folgende Tabelle
    Code:
    Zeit     | Messung   | Wert
    ===========================
    13:18:30 | Messung 1 | 100
    13:18:30 | Messung 2 | 10
    13:18:30 | Messung 3 | 500
    13:18:31 | Messung 2 | 20
    13:18:31 | Messung 4 | 1000
    13:18:32 | Messung 1 | 200
    13:18:32 | Messung 2 | 30
    13:18:33 | Messung 3 | 600
    13:18:33 | Messung 2 | 40
    Es gibt also beliebig viele Messungen (typischerweise so um die 50) welche zu beliebigen Zeitpunkten (viele auch gleichzeitig) einen Messwert in die Tabelle ablegen. Nun muß ich das Ganze umordnen, und zwar so:
    Code:
    Zeit     | Messung 1 | Messung 2 | Messung 3 | Messung 4
    13:18:30 | 100       | 10        | 500       | NULL
    13:18:31 | NULL      | 20        | NULL      | 1000
    13:18:32 | 200       | 30        | NULL      | NULL
    13:18:33 | NULL      | 40        | 600       | NULL
    
    Am Beispiel von nur 2 verschiedenen Messungen hab ich auch herausgefunden wie das hinzubekommen wäre:

    Schritt 1: Alle Einträge jeder Messung holen
    Code:
    select `Zeit`, `Wert` as 'Messung 1' from `Messwerttabelle` where `Messung` = 'Messung 1'
    select `Zeit`, `Wert` as 'Messung 2' from `Messwerttabelle` where `Messung` = 'Messung 2'
    
    Schritt 2: Einen Full Outer Join machen. Da MySQL das ja nicht kann wird hier ein LEFT/RIGHT Join gemacht und dann mit UNION zusammengeführt
    Code:
    SELECT `Zeit`, `Messung 1`, `Messung 2` FROM (select `Zeit`, `Wert` as 'Messung 1' from `test` where `Messung` = 'Messung 1') as t1
    LEFT JOIN (select `Zeit`, `Wert` as 'Messung 2' from `test` where `Messung` = 'Messung 2') as t2 USING(`Zeit`)
    UNION
    SELECT `Zeit`, `Messung 1`, `Messung 2` FROM (select `Zeit`, `Wert` as 'Messung 1' from `test` where `Messung` = 'Messung 1') as t1
    RIGHT JOIN (select `Zeit`, `Wert` as 'Messung 2' from `test` where `Messung` = 'Messung 2') as t2 USING(`Zeit`)
    ORDER BY `Zeit`
    
    Da das Ganze aber nun mit sagen wir mal 50 subselects / tempor. Tabellen gemacht werden müsste bekäme ich hier ein SQL Statement gigantischen ausmaßen und ich denke nicht, dass das die Lösung sein kann/soll.

    Danke & Gruß
     

    Anhänge:

  2. akretschmer

    akretschmer Datenbank-Guru

  3. akretschmer

    akretschmer Datenbank-Guru

    In der Anwendung:

    Code:
    est=*# select * from tbauer ;
      zeit  | messung | wert
    ---------------------+---------+------
     2013-10-02 13:18:30 |  1 |  100
     2013-10-02 13:18:30 |  2 |  10
     2013-10-02 13:18:30 |  3 |  500
     2013-10-02 13:18:31 |  2 |  20
     2013-10-02 13:18:32 |  1 |  200
     2013-10-02 13:18:32 |  2 |  30
     2013-10-02 13:18:33 |  3 |  600
     2013-10-02 13:18:33 |  2 |  40
     2013-10-02 13:18:31 |  4 | 1000
    (9 rows)
    
    Time: 0,170 ms
    test=*# select zeit, sum(case when messung=1 then wert else null end) as messung_1, sum(case when messung=2 then wert else null end) as messung_2, sum(case when messung=3 then wert else null end) as messung_3, sum(case when messung=4 then wert else nullend) as messung_4 from tbauer group by zeit order by zeit;
      zeit  | messung_1 | messung_2 | messung_3 | messung_4
    ---------------------+-----------+-----------+-----------+-----------
     2013-10-02 13:18:30 |  100 |  10 |  500 |
     2013-10-02 13:18:31 |  |  20 |  |  1000
     2013-10-02 13:18:32 |  200 |  30 |  |
     2013-10-02 13:18:33 |  |  40 |  600 |
    (4 rows)
    
    Falls vorher nicht bekannt ist, welche Spalten alles entstehen sollen, wird es schwer. Für PostgreSQL gibt es ein Contrib-Modul "crosstab", was dafür Funktionen mitbringt.

    Generell sollte man das aber einklich so nicht machen, eine DB ist keine Tabellenkalkulation.
     
  4. Thomas Bauer

    Thomas Bauer Neuer Benutzer

    Vielen Dank, hat funktioniert. Das SQL wird sowieso per Code erzeugt, mal schaun wie' s läuft wenn ich das Ganze über ne Tabelle laufen lassen die sagen wir mal 50 solcher Messungen hat und >1.000.000 Zeilen ...
     
  5. ukulele

    ukulele Datenbank-Guru

  6. akretschmer

    akretschmer Datenbank-Guru

  7. ukulele

    ukulele Datenbank-Guru

    Schon klar, aber auf die schnelle habe ich auch PIVOT unter MySQL gesehen. Das Beispiel habe ich gewählt weil dort auch dynamisches PIVOT gemacht wurde.
     
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