表a   b    c
1   1    2
1   3    2
1   2    3
2   3    1如何得到结果(a,c相同,则b的值合并 类似group by a ,c   但是b 不能sum)
a   b    c
1   1,3  2
1   2    3
2   3    1
谢谢!

解决方案 »

  1.   

    参考:--生成测试数据
    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
      

  2.   

    --用户定义函数修改如下:
    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
      

  3.   

    刚写了一个.http://topic.csdn.net/u/20071016/14/9399186c-b0ce-41eb-b5b4-c06b0d2690cb.html
      

  4.   

    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
      

  5.   

    --用户定义函数修改,鉴于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
      

  6.   

    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 行)
    */
      

  7.   

    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中
      

  8.   

    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 表