在SQL中使用group by获取唯一的逗号分隔值

时间:2017-01-09 03:27:49

标签: sql sql-server

我的表格如下

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

我认为这是一个两步过程:

  1. 连接每个ID和名称的所有唯一城市。示例:对于ID 1和名称ABC城市将是伦敦,巴黎,日本

  2. 通过对ID和名称进行分组来更新连接字符串。

  3. 我只能为一个组执行此操作,但如何对表中的所有不同组执行此操作?

    此外,当我想将字符串更新为与ID和Name匹配的所有行时,光标会出现在这里。

    对此有任何帮助或想法将不胜感激。

2 个答案:

答案 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;

产地:

enter image description here

答案 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