Kreuztabelle / Transponieren

Guten Tag,

ich würde gerne wissen, ob man durch “tablefunc”-Funktionen wie “crosstab” oder andere Methoden in der Lage ist, von einer solchen Tabellenstruktur:

id | 1970 | 1971 | 1972 | …
1 | a | b | c | …
2 | d | e | f | …
… | … | … | … | …

auf folgende Tabellenstruktur zu kommen:

id | jahr | wert
1 | 1970 | a
1 | 1971 | b
1 | 1972 | c
1 | … | …
2 | 1970 | d
2 | 1971 | e
2 | 1972 | …
2 | … | …

Ich habe schon viel ausprobiert, komme aber nicht annähernd zu dem passenden Ergebnis. Jetzt würde ich halt gerne wissen, ob diese Verfahrensweise überhaupt möglich ist. Ich wäre für jede Hilfe dankbar!

Vielen Dank im Voraus,
D. Stroeer

Nein, vollständig unmöglich.

test=*# select * from bla;
 id | f1970 | f1971 | f1972
----+-------+-------+-------
  1 | a     | b     | c
  2 | d     | e     | f
(2 rows)

Time: 0,177 ms
test=*# select id, '1970' as jahr, f1970 as wert from bla union all select id, '1971', f1971 from bla union all select id, '1972', f1972 from bla order by id,jahr;
 id | jahr | wert
----+------+------
  1 | 1970 | a
  1 | 1971 | b
  1 | 1972 | c
  2 | 1970 | d
  2 | 1971 | e
  2 | 1972 | f
(6 rows)

Es konnte doch eine Lösung gefunden werden:

SELECT DISTINCT ID, ‘1972’ AS jahr, 1972 AS wert FROM OrigTable
UNION ALL
SELECT DISTINCT ID, ‘1973’ AS jahr, 1973 AS wert FROM OrigTable
UNION ALL
usw usw