如何在 PostgreSQL 中转置列和行(即如何切换行和列)? [复制]
Posted
技术标签:
【中文标题】如何在 PostgreSQL 中转置列和行(即如何切换行和列)? [复制]【英文标题】:How to transpose columns and rows in PostgreSQL (i.e., how do I switch rows and columns)? [duplicate] 【发布时间】:2012-10-29 18:59:14 【问题描述】:可能重复:Transposing an sql result so that one column goes onto multiple columns
我想在我的 PSQL 数据库中进行一种行/列交换。这是我的示例数据库:
id place price year
1 U.S. 80 2000
2 U.S. 60 2001
3 U.S. 40 2002
4 U.K. 600 2000
5 U.K. 500 2001
6 U.K. 350 2002
我想将该表转换为以下示例:
year U.S. U.K.
2000 80 600
2001 60 500
2002 40 350
这在 PostgreSQL 中可行吗?
【问题讨论】:
如果您搜索术语pivot,您会发现很多结果,不一定与postgres 相关。请注意,Oracle 和 SQL Server 实际上实现了PIVOT
子句,而不是 Postgres
查看tablefunc模块中的交叉表函数:postgresql.org/docs/current/static/tablefunc.html
查看:github.com/jumpstarter-io/colpivot 了解动态解决方案。
【参考方案1】:
您可以使用聚合函数和CASE
语句轻松完成此操作:
select year,
sum(case when place = 'U.S.' then price else 0 end) "U.S.",
sum(case when place = 'U.K.' then price else 0 end) "U.K."
from yourtable
group by year
见SQL Fiddle with Demo
【讨论】:
【参考方案2】:这被称为“pivot”,在 postgres 中没有特殊的语法来支持它 - 您必须使用 SQL 对其进行编码,例如:
select
year,
us.price as us,
uk.price as uk
from mytable us
left join mytable uk on us.year = uk.year
【讨论】:
用 100 列做到这一点,你注定要失败……见en.wikipedia.org/wiki/…以上是关于如何在 PostgreSQL 中转置列和行(即如何切换行和列)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章