Use o
crosstab()
variante com dois parâmetros
: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);
Assim, declarando explicitamente qual valor vai em qual coluna de saída. Então a função sabe onde preencher
NULL
valores. Neste caso generate_series()
é útil para fornecer 8 linhas com os números de 1 a 8. Um VALUES
expressão seria uma alternativa:'VALUES (1), (2), (3), (4), (5), (6), (7), (8)'
Além disso, não se esqueça do
ORDER BY
cláusula na primeira consulta de parâmetro. Forneci uma explicação detalhada nesta resposta relacionada .