postgres 交叉表查询中的动态列名

Dynamic column names in a postgres crosstab query

我正在尝试在 postgres 的查询中转换数据。我目前使用的查询如下

SELECT
  product_number,
  month,
  sum(quantity)
FROM forecasts
WHERE date_trunc('month', extract_date) = date_trunc('month', current_date)
GROUP BY product_number, month
ORDER BY product_number, month;

查询的输出如下所示,其中每个产品都有 13 个月的数据。

+--------+------------+----------+
| Number |   Month    | Quantity |
+--------+------------+----------+
|      1 | 2016-10-01 |     7592 |
|      1 | 2016-11-01 |     6796 |
|      1 | 2016-12-01 |     6512 |
|      1 | 2017-01-01 |     6160 |
|      1 | 2017-02-01 |     6475 |
|      1 | 2017-03-01 |     6016 |
|      1 | 2017-04-01 |     6616 |
|      1 | 2017-05-01 |     6536 |
|      1 | 2017-06-01 |     6256 |
|      1 | 2017-07-01 |     6300 |
|      1 | 2017-08-01 |     5980 |
|      1 | 2017-09-01 |     5872 |
|      1 | 2017-10-01 |     5824 |
+--------+------------+----------+

我正在尝试旋转数据,使其看起来像

+--------+-----------+-----------+-----------+----------+-----+
| Number | 2016-10-1 | 2016-11-1 | 2016-12-1 | 2017-1-1 | ... |
+--------+-----------+-----------+-----------+----------+-----+
| 1      |       100 |       100 |       200 |      250 | ... |
| ...    |           |           |           |          |     |
+--------+-----------+-----------+-----------+----------+-----+

每个产品的所有数据在 13 个月内连续显示。

我尝试使用基本的交叉表查询

SELECT *
FROM
crosstab('SELECT product_number, month::TEXT, sum(quantity)
   FROM forecasts
   WHERE date_trunc(''month'', extract_date) = date_trunc(''month'', ''2016-10-1''::DATE)
   GROUP BY product_number, month
   ORDER BY product_number, month')
    As mthreport(product_number text, m0 DATE, m1 DATE, m2 DATE,
        m3 DATE, m4 DATE, m5 DATE, m6 DATE,
        m7 DATE, m8 DATE, m9 DATE, m10 DATE,
        m11 DATE, m12 DATE, m13 DATE)

但是我得到以下错误

ERROR: invalid return type Detail: SQL rowid datatype does not match return rowid datatype.

如果列名是在交叉表中设置的,即如果我可以定义名称并将其放入交叉表输出中,这可行,但由于日期不断变化,我不确定如何定义它们

我想我在这里遗漏了一些非常基本的东西。任何帮助将不胜感激。

希望我已经正确理解了你的问题。

列 m1、m2 .. m13 不是日期类型。这些列将包含数量总和。因此,数据类型将与 sum(quantity) 相同。

我认为下面的查询可以解决您的问题

SELECT *
FROM
 crosstab($$SELECT product_number, month, sum(quantity)::bigint
   FROM forecasts
   GROUP BY product_number, month
   ORDER BY product_number, month$$)
    As mthreport(product_number int, m0 bigint, m1 bigint, m2 bigint,
        m3 bigint, m4 bigint, m5 bigint, m6 bigint,
        m7 bigint, m8 bigint, m9 bigint, m10 bigint,
        m11 bigint, m12 bigint , m13 bigint)