Użyj crosstab()
wariant z dwoma parametrami
:
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);
W ten sposób deklarujemy jawnie, która wartość trafia do której kolumny wyjściowej. Dzięki temu funkcja wie, gdzie wypełnić NULL
wartości. W tym przypadku generate_series()
przydaje się podanie 8 wierszy z liczbami 1-8. VALUES
wyrażenie byłoby alternatywą:
'VALUES (1), (2), (3), (4), (5), (6), (7), (8)'
Nie zapomnij również o ORDER BY
klauzula w pierwszym zapytaniu parametrycznym.
Podałem szczegółowe wyjaśnienie w tej powiązanej odpowiedzi .