sql >> Databáze >  >> RDS >> PostgreSQL

Dynamicky generujte sloupce v PostgreSQL

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.

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

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




  1. Chyba MySql:1364 Pole 'display_name' nemá výchozí hodnotu

  2. Existuje v JPQL takový výraz CASE?

  3. MySQL:ALTER TABLE, pokud sloupec neexistuje

  4. MySQL Vyberte všechny sloupce z jedné tabulky a některé z jiné tabulky