Вы можете использовать расширение tablefunc
. При этом вы можете создать динамическую c таблицу. Для объяснения я буду использовать tablefunc
пример из postgresql руководства.
Здесь у нас есть таблица, в которой есть столбец, подобный вашей week
информации, которая будет преобразована в столбец и связанная с этим информация, которая должна была отображаться в вашем результате.
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');
По сути, функция crosstab
запускает SQL и создает столбцы, динамически именующие столбец значением столбца, объединяя значения, которые необходимо повернуть. Таким образом, для таблицы, созданной выше, результат будет следующим:
SELECT *
FROM crosstab(
'select rowid, attribute, value
from ct
where attribute = ''att2'' or attribute = ''att3''
order by 1,2')
AS ct(row_name text, category_1 text, category_2 text, category_3 text);
row_name | category_1 | category_2 | category_3
----------+------------+------------+------------
test1 | val2 | val3 |
test2 | val6 | val7 |
(2 rows)
И, чтобы показать проанализированный столбец, вы можете использовать двойные кавычки следующим образом:
SELECT *
FROM crosstab(
'select rowid, attribute, value
from ct
where attribute = ''att2'' or attribute = ''att3''
order by 1,2')
AS ct(row_name text, "2020/01/01" text, "2020/07/01" text, "2020/12/01" text);
row_name | 2020/01/01 | 2020/07/01 | 2020/12/01
----------+------------+------------+------------
test1 | val2 | val3 |
test2 | val6 | val7 |
(2 rows)