sql >> Database >  >> RDS >> PostgreSQL

Dynamisch kolommen genereren in PostgreSQL

De eenvoudige kruistabelquery voor uw voorbeeld is eenvoudig:

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);

Maar niet met dynamische kolomnamen of een dynamisch aantal kolommen. Als compromis kunt u een vast aantal kolommen hebben en alleen de leidende vullen. Basis:

  • PostgreSQL-kruistabelquery

Dynamisch?

crosstab_hash gaat je niet helpen met dynamische kolomnamen. Het is voor herhaald gebruik zonder een kolomdefinitielijst te typen, maar niet voor dynamisch kolom namen. Voorbeelden:

  • Dynamisch kolommen genereren voor kruistabel in PostgreSQL
  • Sql:rijen omzetten in kolommen

Voor echt dynamische kolomnamen heeft u twee . nodig heen en terug naar de server. Of u nu de kolomnamen ophaalt met een eerste query om een ​​tweede query te maken, of u maakt een cursor of een tijdelijke tabel of een voorbereide instructie. Wat je ook probeert, je hebt twee retourvluchten nodig. SQL wil het retourtype weten tijdens de oproep.

Het dichtst bij een "dynamische" aanroep kan ik komen met mijn aangepaste crosstab_n() functie gedefinieerd in dit gerelateerde antwoord:

  • Dynamisch alternatief voor draaien met CASE en GROUP BY

Of u geeft het idee van een volledig dynamische kruistabelquery op (omdat het onmogelijk is) en gebruikt een workflow in twee stappen, zoals hierboven vermeld.

  1. Laat een functie de kruistabelquerytekst genereren. U kunt de hier aangeboden functie gebruiken (en aanpassen aan uw behoeften!):

    • Een dynamische kruistabelquery uitvoeren

    Verwijder in het bijzonder GROUP BY 1, 2 , aangezien u geen rijen samenvoegt vóór de kruistabel.

  2. Voer de gegenereerde functie uit.

Voor de volledigheid is er ook de nieuwe \crosstabview metacommando in psql in Postgres 9.6 (net vrijgegeven) - met vergelijkbare functionaliteit, en het kan dynamische kolomnamen weergeven (het toevoegen van dynamische namen gebeurt in de psql-client, niet in de Postgres-server).




  1. Het verschil tussen primaire sleutel en unieke sleutel

  2. Beste MySQL DigitalOcean-prestaties - ScaleGrid versus door DigitalOcean beheerde databases

  3. Hoe werkt een MYSQL Self-Join?

  4. Inleiding tot PL/SQL-pakketten in Oracle Database