Основната заявка за кръстосана таблица за вашия пример е проста:
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
Или се отказвате от идеята за напълно динамична кръстосана заявка (защото, знаете, това е невъзможно) и използвате двуетапен работен процес, както беше споменато по-горе.
-
Позволете на функция да генерира текста на заявката за кръстосана таблица. Можете да използвате предоставената тук функция (и да я адаптирате към вашите нужди!):
- Изпълнете динамична кръстосана заявка
По-специално, премахнете
GROUP BY 1, 2
, тъй като не агрегирате редове преди кръстосаната таблица. -
Изпълнете генерираната функция.
За пълнота има и новият \crosstabview
метакоманда в psql в Postgres 9.6 (току-що пуснат) - с подобна функционалност и може да показва динамични имена на колони (прикачването на динамични имена се случва в psql клиента, а не в сървъра на Postgres).