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