Den grundlæggende krydstabuleringsforespørgsel for dit eksempel er enkel:
SELECT * FROM crosstab(
'SELECT zoom, day, point
FROM province
ORDER BY 1, 2'
, $$VALUES ('2015-10-01'::date), ('2015-10-02')$$)
AS ct (zoom text, day1 int, day2 int);
Men ikke med dynamiske kolonnenavne eller et dynamisk antal kolonner. Som et kompromis kan du have et fast antal kolonner og kun udfylde de førende. Grundlæggende:
- PostgreSQL krydstabulatorforespørgsel
Dynamisk?
crosstab_hash
vil ikke hjælpe dig med dynamiske kolonnenavne. Det er til gentagen brug uden at indtaste en kolonnedefinitionsliste, men ikke til dynamisk kolonnenavne. Eksempler:
- Generér dynamisk kolonner til krydstabulator i PostgreSQL
- Sql:Transponering af rækker til kolonner
For virkelig dynamiske kolonnenavne skal du bruge to rundrejser til serveren. Uanset om du henter kolonnenavnene med en første forespørgsel for at bygge en anden forespørgsel, eller du opretter en markør eller en midlertidig tabel eller en forberedt sætning. Uanset hvad du prøver, har du brug for to rundrejser. SQL ønsker at kende returtypen på opkaldstidspunktet.
Det tætteste jeg kunne komme på et "dynamisk" opkald er med min tilpassede crosstab_n()
funktion defineret i dette relaterede svar:
- Dynamisk alternativ til pivotering med CASE og GROUP BY
Eller du opgiver ideen om en fuldstændig dynamisk krydstabuleringsforespørgsel (fordi, du ved, det er umuligt) og bruger en to-trins arbejdsgang, som nævnt ovenfor.
-
Lad en funktion generere krydstabuleringsforespørgselsteksten. Du kan bruge funktionen her (og tilpasse den til dine behov!):
- Udfør en dynamisk krydstabuleringsforespørgsel
Fjern især
GROUP BY 1, 2
, da du ikke samler rækker før krydstabuleringen. -
Udfør den genererede funktion.
For fuldstændighedens skyld er der også den nye \crosstabview
metakommando i psql i Postgres 9.6 (lige udgivet) - med lignende funktionalitet, og den kan vise dynamiske kolonnenavne (tilknytning af dynamiske navne sker i psql-klienten, ikke i Postgres-serveren).