很多人可能发现,无论是在sql 2000, 还是在 sql 2005 中,都没有提供字符串的聚合函数, 所以, 当我们在处理下列要求时,会比较麻烦, 但在 sql server 2005中, 这种情况得到了改善, 我们可以轻松地完成这项处理。
问题描述:
无论是在sql 2000, 还是在 sql 2005 中,
都没有提供字符串的聚合函数, 所以, 当
我们在处理下列要求时,会比较麻烦:
有表tb, 如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即, group by id, 求 value 的和(字符串相加)
1. 旧的解决方法
创建处理函数
create function dbo.f_str(@id int)
returns varchar(8000)
as
begin
declare @r varchar(8000)
set @r = ''
select @r = @r + ',' + value
from tb
where [email protected]
return stuff(@r, 1, 1, '')
end
go
-- 调用函数
select id, values=dbo.f_str(id)
from tb
group by id
2. 新的解决方法
示例数据
declare @t table(id int, value varchar(10))
insert @t select 1, 'aa'
union all select 1, 'bb'
union all select 2, 'aaa'
union all select 2, 'bbb'
union all select 2, 'ccc'
-- 查询处理
select *
from(
select distinct
id
from @t
)a
outer apply(
select
[values]= stuff(replace(replace(
(
select value from @t n
where id = a.id
for xml auto
), '<n value="', ','), '"/>', ''), 1, 1, '')
)n/*--结果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
--*/
注: 合并与分拆的clr, sql2005的示例中有:
在安装sql 2005的示例后,默认安装目录为 drive:program filesmicrosoft sql server90samplesengineprogrammabilityclrstringutilities中。
新闻热点
疑难解答