Använd crosstab()
variant med två parametrar
:
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);
Deklarerar därigenom uttryckligen vilket värde som går i vilken utdatakolumn. Så funktionen vet var den ska fylla i NULL
värden. I det här fallet generate_series()
är praktiskt att ge 8 rader med siffrorna 1-8. En VALUES
uttryck skulle vara ett alternativ:
'VALUES (1), (2), (3), (4), (5), (6), (7), (8)'
Glöm inte heller ORDER BY
sats i den första parameterfrågan.
Jag gav en detaljerad förklaring i det här relaterade svaret .