中国开发网: 论坛: 程序员情感CBD: 贴子 441420
haitao
通过select @s=@s+ffield+',' from tb可以实现把某列的多行字符串合并到一个字符串;但是想分组合并,就不行了
通过select @s=@s+ffield+',' from tb可以实现把某列的多行字符串合并到一个字符串
但是对于分组汇总,它就无法起作用了。。。。
对于整数字段,sum是汇总,但是对于字符串字段,就没有对应的汇总处理函数了。。。
如:
select fgroup,sum(fint),sum_str(fstr) from tb
group by fgroup
mssql2000支持自定义聚合函数--好像就是用普通的自定义函数用在group by的输出字段里。。。。
--合并函数
CREATE FUNCTION sum_str(@Group varchar(255))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r=''
SELECT @r=@r+','+rtrim(Fstr) FROM TB WHERE Fgroup=@Group

RETURN(substring(@r,2,8000))
END
GO
--调用
select fgroup,sum(fint),sum_str(FGROUP) from tb
group by fgroup

可惜自定义聚合函数不是我预想的格式:
CREATE FUNCTION sum_str(@tb tablename,@fstr fieldname,@fGroup fieldname)
或者更强的:CREATE FUNCTION sum_str(@tb tablename,@fun_sum 自定义函数名,@fGroup fieldname)
如果能这样,那个自定义聚合函数就非常灵活了
现在这样,如果换一个表或换一下fstr或fgroup字段,就需要另外写一个函数了。。。非常不灵活。。。


另外,在实验过程中,发现一个怪事:
--定义测试数据
declare @i int,@j int
declare @tb table (f1 varchar(10),f2 varchar(100))
set @i=1
while @i<10
begin
set @j=1
while @j<5
begin
insert @tb values (round(rand()*10,0),round(rand()*10000,0))
set @j=@j+1
end
set @i=@i+1
end

--select * from @tb

--select f1,count(*) fc from @tb
--group by f1

--select distinct f1 from @tb

declare @s varchar(8000)

set @s=''
select @s=@s+f1+',' from (select distinct f1 from @tb ) a order by f1
select @s
--这个结果是对的:1,10,2,3,4,5,6,7,8,9,(10在2之前,因为f1是字符串,"10"<"2")

set @s=''
select @s=@s+f1+',' from (select distinct f1 from @tb ) a order by cast(f1 as int)
select @s
--这个结果是不对的:10,(只有最后一个!非常奇怪!!)

select f1 from (select distinct f1 from @tb ) a order by cast(f1 as int)
--这个结果也是对的:1 2 3 4 5 6 7 8 9 10
select f1 from (select distinct f1 from @tb ) a order by f1
--这个结果也是对的:1 10 2 3 4 5 6 7 8 9 (10在2之前,也是对的)
我的blog:http://szhaitao.blog.hexun.com & http://www.hoolee.com/user/haitao
--以上均为泛泛之谈--
不尽牛人滚滚来,无边硬伤纷纷现 人在江湖(出来的),哪能不挨刀(总归是要的)
网络对话,歧义纷生;你以为明白了对方的话,其实呢?

您所在的IP暂时不能使用低版本的QQ,请到:http://im.qq.com/下载安装最新版的QQ,感谢您对QQ的支持和使用

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录