Zeilen als Spalten, Full Outer Join?

Thomas Bauer

Neuer Benutzer
Beiträge
2
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

  • test-tabel_2013-10-02.txt
    1,4 KB · Aufrufe: 0
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.150

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.
 

Thomas Bauer

Neuer Benutzer
Beiträge
2
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 ...
 
Werbung:
Oben