Utilisez le crosstab()
variante avec deux paramètres
:
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);
Déclarant ainsi explicitement quelle valeur va dans quelle colonne de sortie. Ainsi, la fonction sait où remplir NULL
valeurs. Dans ce cas generate_series()
est pratique pour fournir 8 rangées avec les numéros 1-8. A VALUES
expression serait une alternative :
'VALUES (1), (2), (3), (4), (5), (6), (7), (8)'
N'oubliez pas non plus le ORDER BY
clause dans la première requête de paramètre.
J'ai fourni une explication détaillée dans cette réponse connexe .