web-dev-qa-db-ja.com

PostgreSQLでピボットテーブルを作成する

次のようなlistingsというPostgresのテーブルがあるとします:

id    neighborhood    bedrooms    price
1     downtown        0           256888
2     downtown        1           334000
3     riverview       1           505000
etc.

寝室ごとの平均価格を列として、近所を行として示すクロス集計クエリを作成するにはどうすればよいですか?

クエリの出力は次のようになります(数値は構成され、列は寝室です)。

            0       1       2       3
riverton    250000  300000  350000  -
downtown    189000  325000  -       450000
14
Avishai

最初に集約関数 avg() で平均を計算します:

_SELECT neighborhood, bedrooms, avg(price)
FROM   listings
GROUP  BY 1,2
ORDER  BY 1,2
_

次に、この関連する回答で詳しく説明されているように、結果をcrosstab()関数にフィードします。

21

Postgresでピボットテーブルを構築する最良の方法は、Caseステートメントです。

select neighborhood,
round(avg((case when bedroom = 0 then price else 0 end)),2) as "0",
round(avg((case when bedroom = 1 then price else 0 end)),2) as "1",
round(avg((case when bedroom = 2 then price else 0 end)),2) as "2",
round(avg((case when bedroom = 3 then price else 0 end)),2) as "3",
from listings
group by neighborhood;

これは私の出力でした

NEIGHBORHOOD                  0          1          2          3
-------------------- ---------- ---------- ---------- ----------
downtown                      0     373.38     328.25     524.63
riverview                     0     256.83          0       1341
north                         0     199.15     507.85     986.31
3
Evan Allen