删除重复项并对结果进行排序,模拟group_concat

时间:2011-06-19 12:44:38

标签: sql-server-2005 tsql sorting duplicates group-concat

我已经找到了这个有趣的帖子

Simulating group_concat MySQL function in Microsoft SQL Server 2005?

use test
go
create table methods (
id int identity,
id_exam int,
method int
)
go
insert into methods (id_exam,method) values (1,5)
insert into methods (id_exam,method) values (1,2)
insert into methods (id_exam,method) values (1,5)
insert into methods (id_exam,method) values (2,1)
insert into methods (id_exam,method) values (3,5)
insert into methods (id_exam,method) values (3,2)
insert into methods (id_exam,method) values (3,2)
insert into methods (id_exam,method) values (4,5)
insert into methods (id_exam,method) values (4,3)

select 
id_exam, 
method = replace ((select method AS [data()]
                   from methods
                   where id_exam = a.id_exam                      
                   order by id_exam for xml path('')), ' ', ',')
from  methods a
where id_exam is not null
group by id_exam

给了我

1   5,2,5
2   1
3   5,2,2
4   5,3

但是,我想从每个考试中删除重复项并对连接结果进行排序以获得

1  2,5
2  1
3  2,5
4  3,5

感谢。

2 个答案:

答案 0 :(得分:4)

尝试在内部查询中使用DISTINCT,并按方法而不是id_exam进行排序。

select 
id_exam, 
method = replace ((select distinct method AS [data()]
                   from methods
                   where id_exam = a.id_exam                      
                   order by method for xml path('')), ' ', ',')
from  methods a
where id_exam is not null
group by id_exam

答案 1 :(得分:1)

在内部查询中添加group by method,并将order by id_exam更改为order by method

select 
id_exam, 
method = replace ((select method AS [data()]
                   from methods
                   where id_exam = a.id_exam
                   group by method                      
                   order by method for xml path('')), ' ', ',')
from  methods a
where id_exam is not null
group by id_exam

结果:

id_exam     method
----------- ---------
1           2,5
2           1
3           2,5
4           3,5