1
--
合并列值
2 -- 原著:邹建
3 -- 改编:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-12-16 广东深圳
4
5 -- 表结构,数据如下:
6 /*
7 id value
8 ----- ------
9 1 aa
10 1 bb
11 2 aaa
12 2 bbb
13 2 ccc
14 */
15 -- 需要得到结果:
16 /*
17 id values
18 ------ -----------
19 1 aa,bb
20 2 aaa,bbb,ccc
21 即:group by id, 求value 的和(字符串相加)
22 */
23 -- 1. 旧的解决方法(在sql server 2000中只能用函数解决。)
24 -- 1. 创建处理函数
25 create table tb(id int, value varchar( 10))
26 insert into tb values( 1, ' aa ')
27 insert into tb values( 1, ' bb ')
28 insert into tb values( 2, ' aaa ')
29 insert into tb values( 2, ' bbb ')
30 insert into tb values( 2, ' ccc ')
31 go
32
33 create function dbo.f_str( @id int)
34 returns varchar( 8000)
35 as
36 begin
37 declare @r varchar( 8000)
38 set @r = ''
39 select @r = @r + ' , ' + value from tb where id = @id
40 return stuff( @r, 1, 1, '')
41 end
42 go
43
44 -- 调用函数
45 SELECt id, value = dbo.f_str(id) FROM tb GROUP BY id
46
47 drop table tb
48 drop function dbo.f_str
49
50 /*
51 id value
52 ----------- -----------
53 1 aa,bb
54 2 aaa,bbb,ccc
55 (所影响的行数为2 行)
56 */
57
58 -- 2、另外一种函数.
59 create table tb(id int, value varchar( 10))
60 insert into tb values( 1, ' aa ')
61 insert into tb values( 1, ' bb ')
62 insert into tb values( 2, ' aaa ')
63 insert into tb values( 2, ' bbb ')
64 insert into tb values( 2, ' ccc ')
65 go
66
67 -- 创建一个合并的函数
68 create function f_hb( @id int)
69 returns varchar( 8000)
70 as
71 begin
72 declare @str varchar( 8000)
73 set @str = ''
74 select @str = @str + ' , ' + cast(value as varchar) from tb where id = @id
75 set @str = right( @str , len( @str) - 1)
76 return( @str)
77 End
78 go
79
80 -- 调用自定义函数得到结果:
81 select distinct id ,dbo.f_hb(id) as value from tb
82
83 drop table tb
84 drop function dbo.f_hb
85
86 /*
87 id value
88 ----------- -----------
89 1 aa,bb
90 2 aaa,bbb,ccc
91 (所影响的行数为2 行)
92 */
93
94 -- 2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
95 create table tb(id int, value varchar( 10))
96 insert into tb values( 1, ' aa ')
97 insert into tb values( 1, ' bb ')
98 insert into tb values( 2, ' aaa ')
99 insert into tb values( 2, ' bbb ')
100 insert into tb values( 2, ' ccc ')
101 go
102 -- 查询处理
103 select * from( select distinct id from tb)a outer apply(
104 select [ values ] = stuff( replace( replace(
105 (
106 select value from tb n
107 where id = a.id
108 for xml auto
109 ), ' <N value=" ', ' , '), ' "/> ', ''), 1, 1, '')
110 )N
111 drop table tb
112
113 /*
114 id values
115 ----------- -----------
116 1 aa,bb
117 2 aaa,bbb,ccc
118
119 (2 行受影响)
120 */
121
122 -- SQL2005中的方法
123 create table tb(id int, value varchar( 10))
124 insert into tb values( 1, ' aa ')
125 insert into tb values( 1, ' bb ')
126 insert into tb values( 2, ' aaa ')
127 insert into tb values( 2, ' bbb ')
128 insert into tb values( 2, ' ccc ')
129 go
130
131 select id, [ values ] = stuff(( select ' , ' + [ value ] from tb t where id =tb.id for xml path( '')), 1, 1, '')
132 from tb
133 group by id
134
135 /*
136 id values
137 ----------- --------------------
138 1 aa,bb
139 2 aaa,bbb,ccc
140
141 (2 row(s) affected)
142
143 */
144
145 drop table tb
2 -- 原著:邹建
3 -- 改编:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-12-16 广东深圳
4
5 -- 表结构,数据如下:
6 /*
7 id value
8 ----- ------
9 1 aa
10 1 bb
11 2 aaa
12 2 bbb
13 2 ccc
14 */
15 -- 需要得到结果:
16 /*
17 id values
18 ------ -----------
19 1 aa,bb
20 2 aaa,bbb,ccc
21 即:group by id, 求value 的和(字符串相加)
22 */
23 -- 1. 旧的解决方法(在sql server 2000中只能用函数解决。)
24 -- 1. 创建处理函数
25 create table tb(id int, value varchar( 10))
26 insert into tb values( 1, ' aa ')
27 insert into tb values( 1, ' bb ')
28 insert into tb values( 2, ' aaa ')
29 insert into tb values( 2, ' bbb ')
30 insert into tb values( 2, ' ccc ')
31 go
32
33 create function dbo.f_str( @id int)
34 returns varchar( 8000)
35 as
36 begin
37 declare @r varchar( 8000)
38 set @r = ''
39 select @r = @r + ' , ' + value from tb where id = @id
40 return stuff( @r, 1, 1, '')
41 end
42 go
43
44 -- 调用函数
45 SELECt id, value = dbo.f_str(id) FROM tb GROUP BY id
46
47 drop table tb
48 drop function dbo.f_str
49
50 /*
51 id value
52 ----------- -----------
53 1 aa,bb
54 2 aaa,bbb,ccc
55 (所影响的行数为2 行)
56 */
57
58 -- 2、另外一种函数.
59 create table tb(id int, value varchar( 10))
60 insert into tb values( 1, ' aa ')
61 insert into tb values( 1, ' bb ')
62 insert into tb values( 2, ' aaa ')
63 insert into tb values( 2, ' bbb ')
64 insert into tb values( 2, ' ccc ')
65 go
66
67 -- 创建一个合并的函数
68 create function f_hb( @id int)
69 returns varchar( 8000)
70 as
71 begin
72 declare @str varchar( 8000)
73 set @str = ''
74 select @str = @str + ' , ' + cast(value as varchar) from tb where id = @id
75 set @str = right( @str , len( @str) - 1)
76 return( @str)
77 End
78 go
79
80 -- 调用自定义函数得到结果:
81 select distinct id ,dbo.f_hb(id) as value from tb
82
83 drop table tb
84 drop function dbo.f_hb
85
86 /*
87 id value
88 ----------- -----------
89 1 aa,bb
90 2 aaa,bbb,ccc
91 (所影响的行数为2 行)
92 */
93
94 -- 2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
95 create table tb(id int, value varchar( 10))
96 insert into tb values( 1, ' aa ')
97 insert into tb values( 1, ' bb ')
98 insert into tb values( 2, ' aaa ')
99 insert into tb values( 2, ' bbb ')
100 insert into tb values( 2, ' ccc ')
101 go
102 -- 查询处理
103 select * from( select distinct id from tb)a outer apply(
104 select [ values ] = stuff( replace( replace(
105 (
106 select value from tb n
107 where id = a.id
108 for xml auto
109 ), ' <N value=" ', ' , '), ' "/> ', ''), 1, 1, '')
110 )N
111 drop table tb
112
113 /*
114 id values
115 ----------- -----------
116 1 aa,bb
117 2 aaa,bbb,ccc
118
119 (2 行受影响)
120 */
121
122 -- SQL2005中的方法
123 create table tb(id int, value varchar( 10))
124 insert into tb values( 1, ' aa ')
125 insert into tb values( 1, ' bb ')
126 insert into tb values( 2, ' aaa ')
127 insert into tb values( 2, ' bbb ')
128 insert into tb values( 2, ' ccc ')
129 go
130
131 select id, [ values ] = stuff(( select ' , ' + [ value ] from tb t where id =tb.id for xml path( '')), 1, 1, '')
132 from tb
133 group by id
134
135 /*
136 id values
137 ----------- --------------------
138 1 aa,bb
139 2 aaa,bbb,ccc
140
141 (2 row(s) affected)
142
143 */
144
145 drop table tb