2012-01-15 6 views
5

私はSQLを初めて使い、Postgresでクロス集計をしようとしていました。私はExcelでそれをやったでしょうが、私は約350万行のデータベース、コードのための20,000の異なる値、catの7つのカテゴリ、そして1から100までの可変の値を持っています。PostgreSQLの3つのカラムと1つのカラムから値が合計されたクロスタ

Excelは行数を処理できないため、SQLはそれです。

私のデータは、フォームテキストとしてコードと猫、Postgresのテーブルに格納された整数値を持つ

code | cat  | value | 
-------------------------------- 
abc123 | 1   | 4 | 
abc234 | 2   | 6 | 
abc345 | 1   | 1 | 
abc123 | 3   | 2 | 
abc123 | 6   | 12 | 

です。

コードと猫のクロス集計を行いたいと思います。私は戻り値に 'null'の代わりに0を表示したいと思いますが、 'null'がより単純なクエリであれば、それは問題ありません。

だから私は希望の出力は、私はPostgresのヘルプファイルや他のフォーラムで検索しました

code | 'cat=0' | 'cat=1' | 'cat=2' | 'cat=3' | 'cat=4' | 'cat=5' | 'cat=6'| 
abc123 | 25  | 0  | 3  | 500 | 250  | 42  | 0  | 
abc234 |  0  | 100 | 0  | 10 | 5  | 0  | 25 | 
abc345 | 1000 | 0  | 0  | 0 | 0  | 0  | 0 | 

です。一番近いのはSOの質問PostgreSQL Crosstab Queryでしたが、3列目の値を合計する方法を理解できませんでした。

ご協力いただければ幸いです。

+0

これまでのことはありますか? ;) – plaes

+0

ちょうど不満..多くのサイトから多くの例を試しました。単純なクロス集計をしても、私は42601のエラーを受けています..タイプの不一致 – Siraj

+0

ええ、でも、これまでに何を試しましたか? – plaes

答えて

3

試してみてください。

select * from crosstab(
'select code, cat, sum(value) as value 
from my_table 
group by code, cat 
order by 1,2' 
) as ct(code text, 
     cat_0 int, 
     cat_1 int, 
     cat_2 int, 
     cat_3 int, 
     cat_4 int, 
     cat_5 int, 
     cat_6 int) 
+2

ありがとう..私はそれを試みたが、このエラーが発生しました....エラー:無効な戻り値タイプ 詳細:SQLのROWIDデータ型が返されるROWIDデータ型と一致しません。 ********** **********エラー ERROR:無効な戻り値の型 SQL状態:42601 詳細:SQLのROWIDデータ型が戻りROWIDデータ型と一致していません。 – Siraj

+0

は 'cat_0'の後にintよりもむしろintを使ってcount(value)を試したが、同じエラーで終了する:sql state:42601 – Siraj

5

私を次のように私のコードを更新することにより、この作業を得た:私は、クロス集計内のselect文を実行して、正しいデータタイプを決定することができました

select * from crosstab(
'select code, cat, sum(value) as value 
from my_table 
group by code, cat 
order by 1,2' 
) as ct(code varchar(255), 
    cat_0 bigint, 
    cat_1 bigint, 
    cat_2 bigint, 
    cat_3 bigint, 
    cat_4 bigint, 
    cat_5 bigint, 
    cat_6 bigint) 

とmy as ctデータ型をクロス集計内のクエリによって返されたデータ型と一致させます。

+0

私はcat_XXという列名がランダムであることに気付きました。あなたがこのようなことを試すことができるのであれば、 – Chris

+0

@Chris SELECT * FROM crosstab( 'あなたのクエリ'、$$ VALUES( 'cat_xx' :: text)、( 'cat_xx2' :: text)$$) –

関連する問題