sql >> Database teknologi >  >> RDS >> PostgreSQL

Generer dynamisk kolonner i PostgreSQL

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.

  1. 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.

  2. 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).




  1. Oracle RAC og sekvenser

  2. Placering af my.cnf-fil på macOS

  3. Svarende til varchar(max) i MySQL?

  4. generere dage fra datointerval