2017-02-11 101 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