有两张表
Table_a有a_id和a_name两列,a_id是PK
Table_b有a_id和b_name两列,没有PK,是多对多关系
现在想得到这样的结果集:
"b_name1", "a_name1,a_name2,a_name3"
"b_name2", "a_name1"
...也就是按照Table_b的b_name分组,第一列显示b_name,第二列是所有对应的a_name,以逗号分隔。一个语句能够实现吗?谢谢!

解决方案 »

  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(@b_name varchar(20))
    returns varchar(8000)
    as
    begin
        declare @ret varchar(8000)
        set @ret=''
        
        select 
            @ret=@ret+','+a.a_name 
        from T
            able_b b,Table_a a 
        where 
            b.a_id=a.a_id
            and
            b.b_name=@b_name
        
        set @ret=stuff(@ret,1,1,'')
        
        return @ret
    end
    goselect b_name,dbo.f_str(b_name) from Table_b group by b_name
    go
      

  3.   

    不明白lzh的意思,你是不是想用b表的数据对a表进行筛选,还是进行分组?用select * from a group by(select … from b)可以达到你想要的效果么?
      

  4.   

    我的意思是显示两个表中的东西,用b表的b_name分组,同时还要显示a表中的a_name。由于a_name不是Group by的参数,不能只用一个group by实现。用SP是能实现,不过我怕没有这个权限……没有别的办法了么?
      

  5.   

    可參考此貼
    http://community.csdn.net/Expert/topic/4364/4364794.xml?temp=.9475977