在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 remains intact.
以上是如何透视 PostgreSQL 表以显示按卧室和社区划分的平均价格?的详细内容。更多信息请关注PHP中文网其他相关文章!