2017-02-11 123 views
1

私はpostgresのクエリでデータをピボットしようとしています。私が現在使用しているクエリは、次のとおりです。postgresクロス集計クエリの動的列名

クエリの出力は、各製品のデータが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 | 
+--------+------------+----------+ 

私はそれは、各製品のすべてのデータが13ヶ月の行に示されている

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

のようなものが見えるようにデータをピボットしようとしています。

私は基本的なクロス集計クエリ

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) 

を使用してみました。しかし、私はに名前を定義して置くことができれば、列名がクロス集計IEで設定された場合、私は次のようなエラー

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

を取得クロスタブの出力は機能しますが、日付が変わり続けるため、それらを定義する方法がわかりません

ここでは非常に基本的なものがないと思います。どんな助けでも本当に感謝しています。

+0

M1のint、int型平方メートル....そのため –

答えて

1

あなたの問題を正しく理解しています。

カラム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) 
+0

おかげとデートなく、あなたの問題を解決します。私はドキュメントを誤解しているようです。型を数値に変更すると固定されました。 – Pras

関連する問題