在 Postgres 中按相同的列值将行转换为列

Convert rows to columns by same column value in Postgres

我有一个 table 喜欢:

id     name    value
--------------------
1      x       100
1      y       200
1      z       300
2      x       10
2      y       abc
2      z       001
3      x       1
...
--------------------

我需要将其转换成类似的东西:

id    x     y     z
---------------------
1     100   200   300
2     10    abc   001
3     1     ...
---------------------

名称已确定。我可以进行多个连接,但我正在寻找更优雅的解决方案。

使用在 Postgres 中使用 filter 语法的条件聚合:

select id,
       max(value) filter (where name = 'x') as x,
       max(value) filter (where name = 'y') as y,
       max(value) filter (where name = 'z') as z
from t
group by id;

附加模块 tablefunc 提供 crosstab() 函数的变体,通常速度最快:

SELECT *
FROM   crosstab(
   'SELECT id, name, value
    FROM   tbl
    ORDER  BY 1, 2'
   ) AS ct (id int, x text, y text, z text);

您的 value 中似乎混合了数字和字符串,所以我选择 text 作为输出。

参见:

  • PostgreSQL Crosstab Query