Rows in einer neein Tabelle als Columns darstellen

Hallo zusammen,

ich habe ein kniffliges Problem:

Ich habe in einer Tabelle zeilenweise Messwerte für einen Artikel mit unterschiedlichen Einheiten:

Article_ID, Data_type, Value
1 pH 2,0
1 OD 3,8
2 pH 1,8
2 OD 4,2
3 pH 3,2
3 OD 2,2



Gibt es die Möglichkeite aus dieser Struktur eine neue Tabelle zu erzeugen, bei der die Datentypen als Colums vertreten sind?


Article_ID, pH, OD
1 2,0 3,8
2 1,8 4,2
3 3,2 2,2

Wie würde die SQL-Syntax dazu lauten?


Viele Dank für Eure Hilfe,
Carsten



test=*# select * from werte;
 id | typ | wert
----+-----+------
  1 | pH  |    2
  1 | OD  |  3.8
  2 | pH  |  1.8
  2 | OD  |  4.2
  3 | pH  |  3.2
  3 | OD  |  2.2
(6 rows)

Time: 3.969 ms
test=*# select id, sum(case when typ = 'pH' then wert else 0 end) as ph, sum(case when typ = 'OD' then wert else 0 end) as od from werte group by id order by id;
 id | ph  | od
----+-----+-----
  1 |   2 | 3.8
  2 | 1.8 | 4.2
  3 | 3.2 | 2.2
(3 rows)

Andreas

wow, besten Dank Andreas…das hilft mir schonmal ungemein weiter. Ich hatte schon geahnt, dass die Lösung eher schlicht ist, hatte aber keinen Ausgangspunkt. Vielen Dank!

Ein letztes noch: wie könnte eine Lösung aussehen bei der die Abfrage selber ermittelt, welche Datentypen es gibt. Wenn z.B. noch ein dritter Messwert hinzukäme und dann automatisch eine dritte Column benötigt wird. Fall du da ein paar Hints hast, mache ich mich in der Lit. auf die Suche.

Nochmals vielen Dank,
Carsten

Man könnte ermitteln, welche DISTINCTen Möglichkeiten es gibt, damit in einer PLPGSQL-Function ein dynamisches SQL basteln und dieses via EXECUTE ausführen.

Reicht das?

Andreas

Hallo Andreas, ich werde mich da mal ranwagen und versuchen eine Lösung zu basteln.

In deiner Lösung adressierst du die einzelen Felder direkt über ihre einfachen Namen. Ich muss bei mir immer alles so angeben: public.“tabelle”.“feld”, sonst erhalte ich immer eine Fehlermeldung. Kann man das umkonfigurieren (arbeite unter Win32) ?

Grüße,
Carsten

Nicht gesetzter SEARCH_PATH?

(arbeite unter Win32) ?

auch das kann man umkonfigurieren.


Andreas

Im Postgres-Source Tree unter ‘contrib’ findest du die sog. tabletools, die Funktionen zum erstellen sog. crosstabs oder Pivot-Tabellen bieten.
Das sollte deine Probleme auch lösen können.

Gruß Uwe

EDIT: Hab das mit Windows nicht gesehen :wink: , das sollte sich dann im Installer einrichten lassen

[quote=“Gisman”]Im Postgres-Source Tree unter ‘contrib’ findest du die sog. tabletools, die Funktionen zum erstellen sog. crosstabs oder Pivot-Tabellen bieten.
Das sollte deine Probleme auch lösen können.

Gruß Uwe

Hi, ich hatte das gleiche Problem und hab die crosstab funktion verwendet. Ich habe allerdings 190 Parameter die nachher zu Spalten konvertiert werden, deshalb möchte ich Angabe der neuen Spaltennamen und -typen gerne automatisieren.
Mit dem Beispiel in der Readme zu den Tabletools kann ich nicht viel anfangen, da Anfänger:-( Kann mir da jemand weiterhelfen bezüglich des Erstellens einer geeigneten Funktion?
Grüße in die Pfalz, auch meine Heimat;-)
Christian

Verständlich.

Versuch, das erst einmal mit 3 oder 4 Parametern händisch zu verstehen. Dann kann man sich dranmachen, das via einer Funktion zu machen, ist letztendlich nur a bissl String-Gefummel, den man dann via EXECUTE verarbeiten kann.

Andreas