Verwenden Sie die crosstab()
Variante mit zwei Parametern
:
SELECT * FROM crosstab(
'SELECT zone_id, group_id, area
FROM ct
ORDER BY 1,2'
,'SELECT g FROM generate_series(1,8) g' -- ! Provide values explicitly
)
AS ct(
row_name integer
, g_1 float8, g_2 float8
, g_3 float8, g_4 float8
, g_5 float8, g_6 float8
, g_7 float8, g_8 float8);
Dadurch wird explizit deklariert, welcher Wert in welche Ausgabespalte kommt. Die Funktion weiß also, wo NULL
einzufügen ist Werte. In diesem Fall generate_series()
bietet sich an, 8 Reihen mit den Zahlen 1-8 zu versehen. A VALUES
Ausdruck wäre eine Alternative:
'VALUES (1), (2), (3), (4), (5), (6), (7), (8)'
Vergessen Sie auch nicht den ORDER BY
-Klausel in der ersten Parameterabfrage.
Ich habe eine detaillierte Erklärung in dieser zugehörigen Antwort bereitgestellt .