2017-02-11 107 views
1

我试图在postgres中查询查询中的数据。我目前使用的查询如下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. 

如果列名是在交叉表即设定,如果我能确定,并把名字变成交叉表输出这个工程,但由于日期不断变化,我不知道如何定义它们

我想我错过了这里非常基本的东西。任何帮助将非常感激。

+0

M1 INT,M2 INT ....没有日期 –

回答

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) 
+0

感谢您的。我似乎误解了文档。将类型更改为数字可以修复它。 – Pras