具有动态列名的PostgreSQL交叉表

时间:2016-11-29 09:50:07

标签: postgresql pivot crosstab

我有以下代码来生成数据透视表:

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(因为每月可能没有行)。

0 个答案:

没有答案