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

时间:2017-02-11 05:39:02

标签: postgresql crosstab

我正在尝试在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.

如果在交叉表中设置了列名,即如果我可以定义并将名称放入交叉表输出中,则可以使用,但由于日期不断变化,我不知道如何定义它们

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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)