问题描述:
无论是在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 行受影响)
--*/CSDN 社区帖子地址 附: 合并与分拆的CLR, sql2005的示例中有:
在安装sql 2005的示例后,默认安装目录为
drive:\Program Files\Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\StringUtilities中

解决方案 »

  1.   

    把同一个字母的聚合在一行内 
    http://www.windbi.com/showtopic-1480.aspx
      

  2.   

    --> Test Data: [T]
    if object_id('[T]') is not null drop table [T]
    create table [T] ([JoinId] varchar(2),[PxInfoId] varchar(3),[A0101] varchar(7))
    insert into [T]
    select '01','001','王静' union all
    select '01','001','Founsys' union all
    select '01','001','xiao' union all
    select '02','002','王海'
    --select * from T
    go
    --Code--SQL2000用函数
    create function f_str
    (@a varchar(10))
    returns varchar(100)
    as
    begin
        declare @s varchar(100)
        select @s = isnull(@s + ',' ,'') +[A0101]  from T where [JoinId] = @a 
        return @s
    end
    goselect distinct [JoinId],[A0101]=dbo.f_str([JoinId]) 
    from T 
    --SQL2005用XML
    select distinct [JoinId],
    [value]=STUFF((select ','+[A0101] from T where [JoinId]=A.[JoinId] for XML path('')),1,1,'')
    FROM T A 
    --Drop
    drop table T
    drop function f_str
    --Result
    /*
    JoinId A0101
    ------ --------------------
    01     王静,Founsys,xiao
    02     王海(2 行受影响)
    */
      

  3.   

    --函数
    create function fn_A0101 (
    @JoinId int
    )
    returns varchar(100)
    as
    begin
      declare @r varchar(100)
      select @r=isnull(@r+',','')+A0101 from PxJionedPeople where JoinId =@JoinId 
      return @r
    end
    go--查询
    select JoinId ,dbo.fn_A0101 (JoinId) as A0101
    from PxJionedPeople 
    group by JoinId
      

  4.   

    CREATE FUNCTION dbo.f_str(@PxInfoId varchar(10)) --創建函數
    RETURNS varchar(8000)
    AS
    BEGIN
        DECLARE @r varchar(8000)
        SET @r = ''
        SELECT @r = @r + ',' + A0101
        FROM [PxJionedPeople]
        WHERE PxInfoId =@PxInfoId
        RETURN STUFF(@r, 1, 1, '')
    END
    GO
    --調用函數
    select JoinId    ,  PxInfoId ,dbo.f_str(PxInfoId) from    [PxJionedPeople] group by   JoinId    ,  PxInfoId
      

  5.   

    --2000下创建一个合并的函数
    create function f_hb(@JoinId int)
    returns varchar(8000)
    as
    begin
      declare @str varchar(8000)
      set @str = ''
      select @str = @str + ',' + cast(A0101 as varchar) from tb where JoinId = @JoinId
      set @str = right(@str , len(@str) - 1)
      return(@str)
    End
    go--调用自定义函数得到结果:
    select distinct JoinId ,dbo.f_hb(JoinId) as A0101 from tb
      

  6.   

    --2005中
    select JoinId, [A0101]=stuff((select ','+[A0101] from tb t where JoinId=tb.JoinId for xml path('')), 1, 1, '')
    from tb
    group by JoinId