Создать динамические c столбцы для CROSSTAB в postgresql? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть эта таблица в postgres

CREATE TABLE ct(id SERIAL, rowid TEXT, attribute TEXT, value TEXT);
INSERT INTO ct(rowid, attribute, value) VALUES('test1','att1','val1');
INSERT INTO ct(rowid, attribute, value) VALUES('test1','att2','val2');
INSERT INTO ct(rowid, attribute, value) VALUES('test1','att3','val3');
INSERT INTO ct(rowid, attribute, value) VALUES('test1','att4','val4');
INSERT INTO ct(rowid, attribute, value) VALUES('test2','att1','val5');
INSERT INTO ct(rowid, attribute, value) VALUES('test2','att2','val6');
INSERT INTO ct(rowid, attribute, value) VALUES('test2','att3','val7');
INSERT INTO ct(rowid, attribute, value) VALUES('test2','att4','val8');

Я хочу сгенерировать динамический c запрос кросс-таблицы, используя эту таблицу. До сих пор я создавал запрос stati c, следуя примеру на официальной странице документации postgres.

select * from crosstab
('select rowid, attribute, value from ct order by 1,2')
as final_result(rowid text, att1 text, att2 text, att3 text, att4 text)

Теперь я хочу, чтобы эта часть была Dynami c

as final_result(rowid text, att1 text, att2 text, att3 text, att4 text)

Я пробовал несколько вещей, таких как

Создание запроса, который генерирует имя столбца с их типами и передает этот запрос как final_result (query), но он не работает как здесь

SELECT 'rowid text, '
       || string_agg(Distinct attribute, ' text, ') as name
FROM   ct;

select * from crosstab
('select rowid, attribute, value from ct order by 1,2')
as final_result(SELECT 'rowid text, '
       || string_agg(Distinct attribute, ' text, ') as name
FROM   ct;)

OR

select * from crosstab
('select rowid, attribute, value from ct order by 1,2', 
SELECT 'rowid text, '
       || string_agg(Distinct attribute, ' text, ')) as name
FROM   ct;)

Оба эти запроса не работают.

Я искал stackoverflow, нашел эту ссылку, но здесь также нет правильного приемлемого ответа,

Динамически генерировать столбцы для кросс-таблицы в PostgreSQL

Есть идеи, как это можно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...