我有以下代码来生成数据透视表:
CREATE EXTENSION tablefunc;
CREATE TABLE ct(id serial, identifier varchar, timeframe varchar, value integer);
INSERT INTO ct(identifier, timeframe, value) VALUES('Conversions', '16/01', 3);
INSERT INTO ct(identifier, timeframe, value) VALUES('Conversions', '16/02', 5);
INSERT INTO ct(identifier, timeframe, value) VALUES('Conversions', '16/03', 2);
INSERT INTO ct(identifier, timeframe, value) VALUES('Quotes', '16/01', 8);
INSERT INTO ct(identifier, timeframe, value) VALUES('Quotes', '16/02', 12);
INSERT INTO ct(identifier, timeframe, value) VALUES('Quotes', '16/03', 15);
SELECT *
FROM crosstab('SELECT identifier, timeframe, value
FROM ct
ORDER BY 1, 2', 'SELECT to_char(generate_series,''YY/MM'') tr FROM generate_series(''2016-01-01'', ''2016-04-13'', ''1 month''::interval) ORDER BY 1')
AS ct(row_name varchar, m1 integer, m2 integer, m3 integer, m4 integer);
结果是:
row_name | m1 | m2 | m3 | m4
Conversions | 3 | 5 | 2 |
Quotes | 8 | 12 | 15 |
函数“generate_series_year_month”到目前为止并不重要,只是在给定开始日期和结束日期的情况下以YY / MM格式提供一系列月份。当我每个月没有为每个标识符添加一行时,它仅用于使交叉表功能正常工作。
我的问题是:如何在输出上动态创建列名,而不必使用m1,m2,m3,m4明确指定它们?
所需的列名称应如下所示:
row_name | 16/01 | 16/02 | 16/03 | 16/04
Conversions | 3 | 5 | 2 |
Quotes | 8 | 12 | 15 |
它们应来自generate_series_year_month函数,而不是来自表ct(因为每月可能没有行)。