1

我正在尝试执行复杂的聚合和连接查询来准备数据以导入网站,将多个结果行和列聚合到每个 ID 的一行中。

我快到了,除了我得到很多 NULL 结果,尽管源数据中没有 NULL 值。

源数据:

ID 值_1 价值_2 值_3 类型
x1 一些文本 其他文本 更多文字 A2
x1 一些文本 其他文本 更多文字 B1
x1 一些文本 其他文本 更多文字 B2
x2 一些文本 其他文本 更多文字 B1
x2 一些文本 其他文本 更多文字 A2
x2 一些文本 其他文本 更多文字 B1

以下:

select distinct id, 
case when type='A2' then string_agg (concat(cast (value_1 as nvarchar (max)),value_1,value_2,value_3)) end as type_A2, 
case when type='B1' then string_agg (concat(cast (value_1 as nvarchar (max)),value_1,value_2,value_3)) end as type_B1
from source
group by id, type

产生:

ID type_a2 类型_B1
x1 一些文本其他文本更多文本 空值
x1 空值 一些文本其他文本更多文本
x2 一些文本其他文本更多文本 空值
x2 空值 一些文本其他文本更多文本

当我尝试一次只运行一列时,我仍然得到一些 NULL 结果。

如何将这些结果放在每个唯一 ID 的一行中?

IE...

ID type_a2 类型_B1
x1 一些文本其他文本更多文本 一些文本其他文本更多文本
x2 一些文本其他文本更多文本 一些文本其他文本更多文本
x3 ETC ETC
4

1 回答 1

2

你想要每行id- 所以,我会先从typeandselect子句group by中删除。接下来,case表达式将进入聚合函数。所以:

select id,
    string_agg(case when type = 'A2' then concat(cast(value_1 as nvarchar(max)), value_1, value_2, value_3) end, ',') as type_a2,
    string_agg(case when type = 'B1' then concat(cast(value_1 as nvarchar(max)), value_1, value_2, value_3) end, ',') as type_b1
from mytable
group by id
于 2020-12-29T01:18:31.937 回答