Základní křížový dotaz pro váš příklad je jednoduchý:
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);
Ale ne s dynamickými názvy sloupců nebo dynamickým počtem sloupců. Jako kompromis můžete mít pevný počet sloupců a vyplnit pouze ty úvodní. Základy:
- PostgreSQL Crosstab Query
Dynamické?
crosstab_hash
vám nepomůže s dynamickými názvy sloupců. Je pro opakované použití bez psaní seznamu definic sloupců, ale ne pro dynamické názvy sloupců. Příklady:
- Dynamicky generujte sloupce pro křížové tabulky v PostgreSQL
- Sql:Převádění řádků do sloupců
Pro skutečně dynamické názvy sloupců potřebujete dva zpáteční cesty na server. Ať už načtete názvy sloupců pomocí prvního dotazu pro vytvoření druhého dotazu, nebo vytvoříte kurzor nebo dočasnou tabulku nebo připravený příkaz. Ať se pokusíte jakkoli, potřebujete dva zpáteční cesty. SQL chce znát návratový typ v době volání.
Nejblíže jsem se k „dynamickému“ volání mohl dostat pomocí vlastního crosstab_n()
funkce definovaná v této související odpovědi:
- Dynamická alternativa k pivotu s CASE a GROUP BY
Nebo se vzdáte myšlenky zcela dynamického kontingenčního dotazu (protože, víte, je to nemožné) a použijete dvoukrokový pracovní postup, jak je uvedeno výše.
-
Nechte funkci vygenerovat text křížového dotazu. Můžete použít funkci poskytnutou zde (a přizpůsobit ji svým potřebám!):
- Proveďte dynamický křížový dotaz
Zejména odstraňte
GROUP BY 1, 2
, protože před křížovou tabulkou neshromažďujete řádky. -
Spusťte vygenerovanou funkci.
Pro úplnost je zde také nový \crosstabview
metacommand v psql v Postgres 9.6 (právě vydáno) – s podobnou funkčností a může zobrazovat dynamické názvy sloupců (připojování dynamických názvů probíhá v klientovi psql, nikoli na serveru Postgres).