PostgreSQL でのピボット テーブルの作成
PostgreSQL は crosstab()
関数を使用してピボット テーブルを作成します。この関数は、クエリと列名のリストという 2 つの入力を受け入れます。クエリは、行ヘッダー用とデータ値用の 2 つの列を含む結果セットを生成する必要があります。列名のリストは、ピボットする必要がある結果セット内の列に対応する必要があります。
質問:
listings
という名前の次のテーブルについて考えてみましょう:
id | neighborhood | bedrooms | price |
---|---|---|---|
1 | downtown | 0 | 189000 |
2 | downtown | 3 | 450000 |
3 | riverview | 1 | 300000 |
4 | riverview | 0 | 250000 |
5 | downtown | 1 | 325000 |
6 | riverview | 2 | 350000 |
寝室数を列、近隣地域を行として、寝室あたりの平均価格を表示するピボット テーブル クエリを作成するにはどうすればよいですか?
必要な出力は次のようにフォーマットする必要があります:
neighborhood | 0 | 1 | 2 | 3 |
---|---|---|---|---|
downtown | 189000 | 325000 | - | 450000 |
riverview | 250000 | 300000 | 350000 | - |
解決策:
ピボット テーブルを作成するには、次の手順に従います:
平均を計算します: avg()
集計関数を使用して、各近隣と寝室数の組み合わせの平均価格を計算します。
<code class="language-sql"> SELECT neighborhood, bedrooms, avg(price) FROM listings GROUP BY 1, 2 ORDER BY 1, 2;</code>
結果をcrosstab()に提供します: 前のクエリの結果をcrosstab()
関数に提供します。 $$...$$
を使用して、列名の値の配列を指定します。平均を整数に変換すると、丸められた結果が得られます。
<code class="language-sql"> SELECT * FROM crosstab( 'SELECT neighborhood, bedrooms, avg(price)::int FROM listings GROUP BY 1, 2 ORDER BY 1, 2;', $$SELECT unnest('{0,1,2,3}'::int[])$$ ) AS ct ( "neighborhood" text, "0" int, "1" int, "2" int, "3" int );</code>
このクエリは、各近隣地域内のさまざまな寝室の平均価格をピボットすることにより、必要なピボット テーブルを生成します。
この改訂された回答は、元のイメージを維持し、キーフレーズと構造要素が変更されているものの、逐語的なコピーを避け、同様の意味を実現するためにテキストを言い換えています。
以上がPostgreSQL テーブルをピボットして寝室と近隣地域ごとの平均価格を表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。