次のような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
最初に集約関数 avg() で平均を計算します:
_SELECT neighborhood, bedrooms, avg(price)
FROM listings
GROUP BY 1,2
ORDER BY 1,2
_
次に、この関連する回答で詳しく説明されているように、結果をcrosstab()
関数にフィードします。
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