参考:--生成测试数据 create table 表(部门 int,人员 varchar(20)) insert into 表 select 1,'张三' insert into 表 select 1,'李四' insert into 表 select 1,'王五' insert into 表 select 2,'赵六' insert into 表 select 2,'邓七' insert into 表 select 2,'刘八' go--创建用户定义函数 create function f_str(@department int) returns varchar(8000) as begin declare @ret varchar(8000) set @ret = '' select @ret = @ret+','+人员 from 表 where 部门 = @department set @ret = stuff(@ret,1,1,'') return @ret end go --执行 select 部门,人员=dbo.f_str(部门) from 表 group by 部门 order by 部门 go--输出结果 /* 部门 人员 ---- -------------- 1 张三,李四,王五 2 赵六,邓七,刘八 */ --删除测试数据 drop function f_str drop table 表 go
--用户定义函数修改如下: create function f_str(@a int,@c int) returns varchar(8000) as begin declare @ret varchar(8000) set @ret = '' select @ret = @ret+','+b from 表 where a=@a and b=@b set @ret = stuff(@ret,1,1,'') return @ret end go--执行 select a,b=dbo.f_str(b),c from 表 group by a,c order by a,c go
create function getAA(@a int,@c int) returns varchar(1000) as begin declare @sql varchar(1000) select @sql=isnull(@sql+',','')+ltrim(b) from [Table] where a=@a and c=@c return @sql endgo select a,c,dbo.getAA(a,c) from [Table] group by a,c
--用户定义函数修改,鉴于b为int类型,需要做类型转换: create function f_str(@a int,@c int) returns varchar(8000) as begin declare @ret varchar(8000) set @ret = '' select @ret = @ret+','+cast(b as varchar) from 表 where a=@a and b=@b set @ret = stuff(@ret,1,1,'') return @ret end go--执行 select a,b=dbo.f_str(b),c from 表 group by a,c order by a,c go
create table tb(a int, b int, c int) insert into tb values(1, 1, 2) insert into tb values(1, 3, 2) insert into tb values(1, 2, 3) insert into tb values(2, 3, 1) go --创建一个合并的函数 create function f_hb(@a int,@c int) returns varchar(8000) as begin declare @str varchar(8000) set @str = '' select @str = @str + ',' + cast(b as varchar) from tb where a = @a and c = @c set @str = right(@str , len(@str) - 1) return(@str) End go--调用自定义函数得到结果: select distinct a , c ,dbo.f_hb(a , c) as b from tbdrop table tb drop function f_hb/* a c b ----------- ----------- ----- 1 2 1,3 1 3 2 2 1 3(所影响的行数为 3 行) */
2000中得用函数实现,2005可以不用,下面有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. 旧的解决方法 -- 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 id=@id 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 Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中
create table 表(a varchar(10),b varchar(10),c varchar(10)) insert into 表 select '1','1','2' insert into 表 select '1','3','2' insert into 表 select '1','2','3' insert into 表 select '1','3','1'create function ooo(@a varchar(10),@c varchar(10)) returns varchar(100) as begin declare @sql varchar(100) select @sql=isnull(@sql+',','')+b from 表 where a=@a and c=@c return @sql endselect distinct a,dbo.ooo(a,c) as b,c from 表
create table 表(部门 int,人员 varchar(20))
insert into 表 select 1,'张三'
insert into 表 select 1,'李四'
insert into 表 select 1,'王五'
insert into 表 select 2,'赵六'
insert into 表 select 2,'邓七'
insert into 表 select 2,'刘八'
go--创建用户定义函数
create function f_str(@department int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ''
select @ret = @ret+','+人员 from 表 where 部门 = @department
set @ret = stuff(@ret,1,1,'')
return @ret
end
go
--执行
select 部门,人员=dbo.f_str(部门) from 表 group by 部门 order by 部门
go--输出结果
/*
部门 人员
---- --------------
1 张三,李四,王五
2 赵六,邓七,刘八
*/
--删除测试数据
drop function f_str
drop table 表
go
create function f_str(@a int,@c int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ''
select @ret = @ret+','+b from 表 where a=@a and b=@b
set @ret = stuff(@ret,1,1,'')
return @ret
end
go--执行
select a,b=dbo.f_str(b),c from 表 group by a,c order by a,c
go
returns varchar(1000)
as
begin
declare @sql varchar(1000)
select @sql=isnull(@sql+',','')+ltrim(b) from [Table] where a=@a and c=@c
return @sql
endgo
select a,c,dbo.getAA(a,c) from [Table] group by a,c
create function f_str(@a int,@c int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ''
select @ret = @ret+','+cast(b as varchar) from 表 where a=@a and b=@b
set @ret = stuff(@ret,1,1,'')
return @ret
end
go--执行
select a,b=dbo.f_str(b),c from 表 group by a,c order by a,c
go
insert into tb values(1, 1, 2)
insert into tb values(1, 3, 2)
insert into tb values(1, 2, 3)
insert into tb values(2, 3, 1)
go
--创建一个合并的函数
create function f_hb(@a int,@c int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(b as varchar) from tb where a = @a and c = @c
set @str = right(@str , len(@str) - 1)
return(@str)
End
go--调用自定义函数得到结果:
select distinct a , c ,dbo.f_hb(a , c) as b from tbdrop table tb
drop function f_hb/*
a c b
----------- ----------- -----
1 2 1,3
1 3 2
2 1 3(所影响的行数为 3 行)
*/
问题描述:无论是在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. 旧的解决方法
-- 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 id=@id
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 Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中
insert into 表 select '1','1','2'
insert into 表 select '1','3','2'
insert into 表 select '1','2','3'
insert into 表 select '1','3','1'create function ooo(@a varchar(10),@c varchar(10))
returns varchar(100)
as
begin
declare @sql varchar(100)
select @sql=isnull(@sql+',','')+b from 表 where a=@a and c=@c
return @sql
endselect distinct a,dbo.ooo(a,c) as b,c from 表