如何在 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 中转置列和行(即如何切换行和列)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中转置列和行的简单方法?

以“错误”的方式呈现表格:转置列和行?

如何在 Flutter 中将列和行项居中?

如何设置JTable列和行颜色?

c#中如何获取MYSQL数据库名称、表、列和行

当列和行与平面文件不匹配时,如何解决(使用)ETL