在PostgreSQL中建立透視表
PostgreSQL 使用 crosstab()
函式建立透視表。此函數接受兩個輸入:一個查詢和一個列名列表。查詢應產生一個包含兩列的結果集:一列用於行標題,另一列用於資料值。列名清單應與應進行透視的結果集中的列相對應。
問題:
考慮名為 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>
此查詢透過在每個社區內對不同臥室的平均價格進行透視,產生所需的透視表。
This revised response maintains the original image and rephrases the text to achieve a similar meaning while avoiding verbatim copying. Key phrases and structural elements are altered, but the core information remain hrases and structural elements are altered, but the core information remains intses.
以上是如何透視 PostgreSQL 表以顯示按臥室和社區劃分的平均價格?的詳細內容。更多資訊請關注PHP中文網其他相關文章!