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

ovfsdjhp  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(338)

我有一张这样的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     ...
---------------------

名字是确定的。我可以做多个连接,但我正在寻找一个更优雅的解决方案。

x6h2sr28

x6h2sr281#

使用在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;
zkure5ic

zkure5ic2#

附加模块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交叉表查询

相关问题