我有这样一张table:
| 身份证|源|刻痕|
| - ------|- ------|- ------|
| 1个|项目a|十个|
| 1个|b.人口基金|十五|
| 第二章|项目a|二十个|
| 第二章|(c)秘书长的报告|二十五|
在此表中,id
和source
构成唯一键。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)?
1条答案
按热度按时间41zrol4v1#
您只需要使用
CASE
来实现您的逻辑,然后用一些聚合来扁平化结果(我使用了MAX()
)您指出
null
是可以的,但如果必须使用零,则添加COALESCE()