我的表格如下
ID | Name | City
------ | ------ | ------
1 | ABC | London, Paris
1 | ABC | Paris
1 | ABC | Japan
2 | XYZ | Delhi
2 | XYZ | Delhi, New York
我的输出必须是这样的:
ID | Name | City
------ | ------ | ------
1 | ABC | London, Paris, Japan
2 | XYZ | Delhi, New York
我认为这是一个两步过程:
连接每个ID和名称的所有唯一城市。示例:对于ID 1和名称ABC城市将是伦敦,巴黎,日本
通过对ID和名称进行分组来更新连接字符串。
我只能为一个组执行此操作,但如何对表中的所有不同组执行此操作?
此外,当我想将字符串更新为与ID和Name匹配的所有行时,光标会出现在这里。
对此有任何帮助或想法将不胜感激。
答案 0 :(得分:7)
您应该首先考虑规范您的表格。
在这里,您首先要将所有逗号分隔值转换为单独的行,然后使用STUFF和FOR XML PATH将它们组合在一起。
with your_table (ID, name, City)
as (
select 1, 'ABC', 'London, Paris'
union all
select 1, 'ABC', 'Paris'
union all
select 1, 'ABC', 'Japan'
union all
select 2, 'XYZ', 'Delhi'
union all
select 2, 'XYZ', 'Delhi, New York'
), your_table_modified
as (
select distinct id, name, Split.a.value('.', 'varchar(100)') City
from (
select id, name, cast('<x>' + replace(City, ', ', '</x><x>') + '</x>' as xml) as x
from your_table
) t
cross apply x.nodes('/x') as Split(a)
)
select id, name, stuff((
select ', ' + city
from your_table_modified t2
where t.id = t2.id
for xml path(''), type
).value('(./text())[1]', 'varchar(max)')
, 1, 2, '')
from your_table_modified t
group by id, name;
产地:
答案 1 :(得分:-1)
试试这个:
select y.id,y.name,y.city from (
select id,name, case when Id=1 and name='ABC' then 'London,Paris,Japan'
when Id=2 and name='XYZ' then 'Delhi,Newyork'
end as CIty
,row_number () over (partition by id order by name asc) as rnk
from Yourtable
)y
where y.rnk=1