通过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之前,也是对的)