sql >> Databasteknik >  >> RDS >> PostgreSQL

Generera dynamiskt kolumner i PostgreSQL

Den grundläggande korstabellsfrågan för ditt exempel är 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 inte med dynamiska kolumnnamn eller ett dynamiskt antal kolumner. Som en kompromiss kan du ha ett fast antal kolumner och bara fylla de ledande. Grunderna:

  • PostgreSQL Crosstab Query

Dynamisk?

crosstab_hash kommer inte att hjälpa dig med dynamiska kolumnnamn. Det är för upprepad användning utan att skriva en kolumndefinitionslista, men inte för dynamisk kolumnnamn. Exempel:

  • Generera dynamiskt kolumner för korstabell i PostgreSQL
  • Sql:Överför rader till kolumner

För verkligt dynamiska kolumnnamn behöver du två tur och retur till servern. Oavsett om du hämtar kolumnnamnen med en första fråga för att bygga en andra fråga, eller om du skapar en markör eller en tillfällig tabell eller en förberedd sats. Vad du än försöker behöver du två rundresor. SQL vill veta returtypen vid anropstid.

Det närmaste jag kan komma ett "dynamiskt" anrop är med min anpassade crosstab_n() funktion definierad i detta relaterade svar:

  • Dynamiskt alternativ till pivotering med CASE och GROUP BY

Eller så ger du upp idén om en helt dynamisk korstabellsfråga (för, du vet, det är omöjligt) och använder ett arbetsflöde i två steg, som nämnts ovan.

  1. Låt en funktion generera korstabellsfrågetexten. Du kan använda funktionen som tillhandahålls här (och anpassa den efter dina behov!):

    • Kör en dynamisk korstabellsfråga

    Ta bort särskilt GROUP BY 1, 2 , eftersom du inte aggregerar rader före korstabuleringen.

  2. Kör den genererade funktionen.

För fullständighetens skull finns det också den nya \crosstabview metakommando i psql i Postgres 9.6 (nyss släppt) - med liknande funktionalitet, och den kan visa dynamiska kolumnnamn (att bifoga dynamiska namn sker i psql-klienten, inte i Postgres-servern).




  1. Android:SQLite sparar strängarray?

  2. Hur man exporterar resultaten av en fråga med MySQL Workbench

  3. Barman Cloud – Del 1:WAL Archive

  4. Hur får jag ID för flera infogade rader i MySQL?