在 Postgresql 中反透视

Posted

技术标签:

【中文标题】在 Postgresql 中反透视【英文标题】:Unpivot in Potgresql 【发布时间】:2017-08-30 01:00:00 【问题描述】:

如何在不使用 UNION 的情况下在 Postgresql 中进行反透视?我有超过 100 列,我正在寻找一种简洁的方法来完成它。

给定表:

id    c1      c2      c3
1      X       Y       Z
2      A       B       C
3      Y       C       Z

想要的表:

id   col
1     X
1     Y
1     Z
2     A
2     B
2     C
3     Y
3     C
3     Z

【问题讨论】:

【参考方案1】:

使用jsonb functions:

select id, value as col
from my_table
cross join jsonb_each_text(to_jsonb(my_table))
where key <> 'id';

 id | value 
----+-------
  1 | X
  1 | Y
  1 | Z
  2 | A
  2 | B
  2 | C
  3 | Y
  3 | C
  3 | Z
(9 rows)

Db<>Fiddle.


在 Postgres 9.3 或 9.4 中使用 to_json()json_each_text()

在 9.1 或 9.2 版本中安装 hstore:

create extension if not exists hstore;

select id, value as col
from my_table
cross join each(hstore(my_table))
where key <> 'id';

【讨论】:

谢谢@klin。我收到以下错误:函数 to_jsonb(my_table) 不存在。你知道为什么会这样吗? 该功能在 Postgres 9.5+ 中可用;如果您有 9.3 或 9.4 版,请使用 json_each_text()to_json() 谢谢,但遇到同样的错误。会不会是我的 postgres 安装丢失了什么? 你的 Postgres 版本是多少? 现在是 9.2。大概就是这个原因吧!

以上是关于在 Postgresql 中反透视的主要内容,如果未能解决你的问题,请参考以下文章

在 SSIS 中反透视数据

Postgresql 如何在 SQL 数据库上透视表

使用 PostgreSQL 创建数据透视表

在 Tableau 中反透视数据 将行转换为列

在 SQL 中反透视表时获取值存在的列的位置

在 Postgres 9.6 中创建数据透视表