背景
今天在博问上看到一个SQL语句需求:
表结构id name
1 罗涛
1 涛帅帅
2 刘亮
2 亮哥
2 亮傻要得出结果
id name
1 罗涛,涛帅帅
2 刘亮,亮哥,亮傻
解决方案
这是一个典型的分组合并的需求,一般有两种方法,一是写一个函数处理,二是用xml for path方法,代码如下:
1
--
建立测试环境
2 Create table BWTEST
3 (
4 id Int ,
5 name Varchar ( 10 )
6 )
7 GO
8 -- 插入数据
9 Insert BWTEST Values ( 1 , ' 罗涛 ' )
10 Insert BWTEST Values ( 1 , ' 涛帅帅 ' )
11 Insert BWTEST Values ( 2 , ' 刘亮 ' )
12 Insert BWTEST Values ( 2 , ' 亮哥 ' )
13 Insert BWTEST Values ( 2 , ' 亮傻 ' )
14 GO
15
16 -- 方法一:函数法
17 -- 创建函数
18 Create Function Getb( @id Int )
19 RETURNS Varchar ( 8000 )
20 AS
21 BEGIN
22 DECLARE @s Varchar ( 8000 )
23 SET @s = ''
24 SELECT @s = @s + ' , ' + name FROM BWTEST WHERE id = @id ;
25 RETURN @s
26 END
27 GO
28
29 -- 调用
30 Select id, Substring (dbo.Getb(id), 2 , LEN (dbo.Getb(id)) - 1 ) as name from BWTEST Group By id;
31
32
33 -- 方法二:利用XML path法
34 SELECT id, STUFF (( SELECT ' , ' + name FROM BWTEST WHERE id = BW.id FOR xml path( '' )), 1 , 1 , '' ) AS name FROM BWTEST BW GROUP BY id
35
36
37 -- 删除测试环境
38 Drop Function Getb
39 Drop table BWTEST
40 -- 结果
41 /*
42 id name
43 ----------- --------
44 1 罗涛,涛帅帅
45 2 刘亮,亮哥,亮傻
46 */
2 Create table BWTEST
3 (
4 id Int ,
5 name Varchar ( 10 )
6 )
7 GO
8 -- 插入数据
9 Insert BWTEST Values ( 1 , ' 罗涛 ' )
10 Insert BWTEST Values ( 1 , ' 涛帅帅 ' )
11 Insert BWTEST Values ( 2 , ' 刘亮 ' )
12 Insert BWTEST Values ( 2 , ' 亮哥 ' )
13 Insert BWTEST Values ( 2 , ' 亮傻 ' )
14 GO
15
16 -- 方法一:函数法
17 -- 创建函数
18 Create Function Getb( @id Int )
19 RETURNS Varchar ( 8000 )
20 AS
21 BEGIN
22 DECLARE @s Varchar ( 8000 )
23 SET @s = ''
24 SELECT @s = @s + ' , ' + name FROM BWTEST WHERE id = @id ;
25 RETURN @s
26 END
27 GO
28
29 -- 调用
30 Select id, Substring (dbo.Getb(id), 2 , LEN (dbo.Getb(id)) - 1 ) as name from BWTEST Group By id;
31
32
33 -- 方法二:利用XML path法
34 SELECT id, STUFF (( SELECT ' , ' + name FROM BWTEST WHERE id = BW.id FOR xml path( '' )), 1 , 1 , '' ) AS name FROM BWTEST BW GROUP BY id
35
36
37 -- 删除测试环境
38 Drop Function Getb
39 Drop table BWTEST
40 -- 结果
41 /*
42 id name
43 ----------- --------
44 1 罗涛,涛帅帅
45 2 刘亮,亮哥,亮傻
46 */