postgresql 如何部分转置表格?

72qzrwbm  于 2023-01-25  发布在  PostgreSQL
关注(0)|答案(1)|浏览(146)

我有这样一张table:
| 身份证|源|刻痕|
| - ------|- ------|- ------|
| 1个|项目a|十个|
| 1个|b.人口基金|十五|
| 第二章|项目a|二十个|
| 第二章|(c)秘书长的报告|二十五|
在此表中,idsource构成唯一键。source可以是"a"、"b"或"c"之一。
我想把它变成这样:
| 身份证|评分_a|评分_b|评分_c|
| - ------|- ------|- ------|- ------|
| 1个|十个|十五|无|
| 第二章|二十个|无|二十五|
我不介意如果0是空的,如果这会使它更容易。
目标表应该是以下步骤的结果:

for every row in the table:
    if source = 'a', add or update a row with id and score_a = score
    if source = 'b', add or update a row with id and score_b = score
    if source = 'c', add or update a row with id and score_c = score

我尝试了以下陈述:

select id, score as score_a, null as score_b, null as score_c from tbl where source = 'a'
union all
select id, null as score_a, score as score_b, null as score_c from tbl where source = 'b'
union all
select id, null as score_a, null as score_b, score as score_c from tbl where source = 'c'

但它却给了我这样的结果:
| 身份证|评分_a|评分_b|评分_c|
| - ------|- ------|- ------|- ------|
| 1个|十个|零|零|
| 第二章|二十个|零|零|
| 1个|零|十五|零|
| 第二章|零|零|二十五|
我怎样才能得到一个像我想要的那样的表(有不同的id)?

41zrol4v

41zrol4v1#

您只需要使用CASE来实现您的逻辑,然后用一些聚合来扁平化结果(我使用了MAX()

SELECT id,
       MAX(CASE WHEN source='a' THEN score END) as score_a,
       MAX(CASE WHEN source='b' THEN score END) as score_b,
       MAX(CASE WHEN source='c' THEN score END) as score_c
FROM Tbl
GROUP BY id
    • 演示**

您指出null是可以的,但如果必须使用零,则添加COALESCE()

相关问题