PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Динамично генериране на колони в PostgreSQL

Основната заявка за кръстосана таблица за вашия пример е проста:

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

Ноне с динамични имена на колони или динамичен брой колони. Като компромис можете да имате фиксиран брой колони и да попълвате само водещите. Основи:

  • PostgreSQL Crosstab Query

Динамичен?

crosstab_hash няма да ви помогне с динамични имена на колони. Той е за многократна употреба без въвеждане на списък с дефиниции на колони, но не и за динамичен имена на колони. Примери:

  • Динамично генериране на колони за кръстосана таблица в PostgreSQL
  • Sql:Транспониране на редове в колони

За наистина динамични имена на колони са ви необходими две двупосочни пътувания до сървъра. Независимо дали извличате имената на колоните с първа заявка, за да създадете втора заявка, или създавате курсор, временна таблица или подготвен израз. Каквото и да опитате, имате нужда от две двупосочни пътувания. SQL иска да знае типа на връщането по време на повикване.

Най-близкото до „динамично“ повикване е с моя персонализиран crosstab_n() функция, дефинирана в този свързан отговор:

  • Динамична алтернатива на завъртане с CASE и GROUP BY

Или се отказвате от идеята за напълно динамична кръстосана заявка (защото, знаете, това е невъзможно) и използвате двуетапен работен процес, както беше споменато по-горе.

  1. Позволете на функция да генерира текста на заявката за кръстосана таблица. Можете да използвате предоставената тук функция (и да я адаптирате към вашите нужди!):

    • Изпълнете динамична кръстосана заявка

    По-специално, премахнете GROUP BY 1, 2 , тъй като не агрегирате редове преди кръстосаната таблица.

  2. Изпълнете генерираната функция.

За пълнота има и новият \crosstabview метакоманда в psql в Postgres 9.6 (току-що пуснат) - с подобна функционалност и може да показва динамични имена на колони (прикачването на динамични имена се случва в psql клиента, а не в сървъра на Postgres).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да задам парола за 'psql' неинтерактивно?

  2. Хибернация + PostgreSQL + Тип мрежов адрес (inet, cdir)

  3. Генериране на времеви серии между две дати в PostgreSQL

  4. [Видео] Сила на индексиране в PostgreSQL

  5. PgBouncer 1.7 – „Цветовете варират след възкресението“