Zeilen in Spalten umwandeln

Hallo,
ich habe eine Tabelle an der ich eine SQL-Abfrage mache.
Die Tabelle sieht wie folgt aus:
Zeit | Messwerttyp | Messwert
04:00 | 1 | 12.4
04:00 | 2 | 104
03:40 | 1 | 12.3
03:40 | 2 | 103
03:20 | 1 | 12.2
03:20 | 2 | 102
03:00 | 1 | 12.1
03:00 | 2 | 101
Ausgeben möchte ich dies nun nach Zeit sortiert
in Messwerttypen nebeneinander:
Zeit | Messwerttyp 1 | Messwerttyp 2
04:00 | 12.4 | 104
03:40 | 12.3 | 103
03:20 | 12.2 | 102
03:00 | 12.1 | 101
Ist es nun möglich, direkt eine SQL-Abfrage die Zeilen -> Spalten-Umwandlung zu machen ?
Danke für Eure Hilfe

Ja, wenn auch nicht trivial (okay, bei dem Beispiel schon noch)

Zuerst einmal hilft Dir bei sowas CASE. Hier erst mal die Originaldaten bei mir:

test=*# select * from werte;
          zeit          | typ |  wert
------------------------+-----+--------
 2006-12-31 05:00:00+01 |   1 |  12.40
 2006-12-31 05:00:00+01 |   2 | 104.00
 2006-12-31 04:40:00+01 |   1 |  12.30
 2006-12-31 04:40:00+01 |   2 | 103.00
 2006-12-31 04:20:00+01 |   1 |  12.20
 2006-12-31 04:20:00+01 |   2 | 102.00
(6 rows)

Nun mit CASE schon fast in der von dir gewünschten Form:

test=# select zeit, case when typ=1 then wert else null end as typ1, case when typ=2 then wert else null end as typ2 from werte;
          zeit          | typ1  |  typ2
------------------------+-------+--------
 2006-12-31 05:00:00+01 | 12.40 |
 2006-12-31 05:00:00+01 |       | 104.00
 2006-12-31 04:40:00+01 | 12.30 |
 2006-12-31 04:40:00+01 |       | 103.00
 2006-12-31 04:20:00+01 | 12.20 |
 2006-12-31 04:20:00+01 |       | 102.00
(6 rows)

Und noch etwas gruppiert, dann sieht das auch noch hübsch aus:

test=*# select zeit, sum(case when typ=1 then wert else null end) as typ1, sum(case when typ=2 then wert else null end) as typ2 from werte group by zeit;
          zeit          | typ1  |  typ2
------------------------+-------+--------
 2006-12-31 04:20:00+01 | 12.20 | 102.00
 2006-12-31 04:40:00+01 | 12.30 | 103.00
 2006-12-31 05:00:00+01 | 12.40 | 104.00
(3 rows)

Falls Du mehr sowas brauchst, im CONTRIB gibt es tablefunc-Modul, das enthält Erweiterungen für Kreuztabellen.


Andreas

Habe durch google diesen Beitrag gefunden und möchte mich gerne dafür bedanken!
Hat mir eine Menge arbeit erspart.

lG

Hallo,

ich habe im Moment ein ähnliches Problem und hoffe jemand kann mir da weiterhelfen.

Ich habe folgende Tabelle:

Name | Funktion | Typ | Rufnummer
----------±--------±-------±-----------------
Benutzer1 |Manager | Tel | 089 / 111 111 11
Benutzer1 |Manager | Mobil | 0151 / 222 222 22

Ich versuche die Tabelle in folgende Form zu bringen:

Name | Funktion | Tel | Mobil
----------±--------±---------------------±-----------------
Benutzer1 |Manager | 089 / 111 111 11 | 0151 / 222 222 22

Vielen Dank im vorraus.

Viele Grüße

Betrachte bitte nicht eine relationale DB als Tabellenkalkulation. Aber auch Dir kann geholfen werden:

test=*# select * from foo;
   name    | funktion |  typ  | nummer
-----------+----------+-------+--------
 benutzer1 | manager  | tel   | 0815
 benutzer1 | manager  | mobil | 4711
(2 rows)

Time: 0,233 ms
test=*# select name, funktion, array_to_string (telefon, '','') as telefon, array_to_string(handy,'','') as handy from (select name, funktion, array_agg(telefon) as telefon, array_agg(handy) as handy from (select name, funktion, case when typ='tel' then nummer else null end as telefon, case when typ='mobil' then nummer else null end as handy from foo) bla group by 1,2) batz;
   name    | funktion | telefon | handy
-----------+----------+---------+-------
 benutzer1 | manager  | 0815    | 4711
(1 row)

Kann man sicherlich noch vereinfachen, das ist bei mir halt erst mal so generisch gewachsen …


Andreas

Hallo,

dann hätte ich auch noch einmal eine Frage zu diesem Thema, da mir die obige Lösung schon mächtig weitergeholfen hat.
Mein SQL sieht so aus :

select Begriff,
sum(case when Bedingung = 1 then count(Wert) else null end) AS W1,
sum(case when Bedingung = 2 then count(Wert) else null end) AS W2,
sum(case when Bedingung = 3 then count(Wert) else null end) AS W3
from Tabelle
group by Begriff

Wie es aussieht gefällt Oracle mein “count(Wert)” nicht da ich die Fehlermeldung
“not a single-group” by function bekomme.
Lässt sich das lösen?

Danke
Sören

Wie es aussieht gefällt Oracle mein “count(Wert)” nicht

Dir ist schon klar, dass es hier um PostgreSQL geht (siehe das große Logo links oben auf der Seite) und nicht um Oracle?

Sorry nein, das war mir nicht klar. Habe meine Probleme einfach in Google eingegeben und bin auf diesen Post gestossen.
Da der Thread mir sehr weitergeholfen hat und die Lösungen funktioniert haben, habe ich hier einfach weitergemacht.
Wenn sich die SQLs so sehr unterscheiden, dann sorry für die überflüssige Frage…