问题:假设有张表(tb)如下:
编号 姓名 选修课程 
1   张三 语文 
2   张三 数学 
3   张三 物理 
4   李四 语文 
5   李四 数学 
6   李四 化学 
想变成(得到如下结果): 
姓名 选修课程 
---- ------------
李四 语文,数学,化学
张三 语文,数学,物理
 -------------------
请问该怎么做呢?多谢

解决方案 »

  1.   

    --3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3
    GO--合并处理函数
    CREATE FUNCTION dbo.f_str(@col1 varchar(10))
    RETURNS varchar(100)
    AS
    BEGIN
    DECLARE @re varchar(100)
    SET @re=''
    SELECT @re=@re+','+CAST(col2 as varchar)
    FROM tb
    WHERE col1=@col1
    RETURN(STUFF(@re,1,1,''))
    END
    GO--调用函数
    SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
    --删除测试
    DROP TABLE tb
    DROP FUNCTION f_str
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    GO
      

  2.   

    --> 测试数据: #T
    if object_id('tempdb.dbo.#T') is not null drop table #T
    create table #T (编号 int,姓名 varchar(4),选修课程 varchar(4))
    insert into #T
    select 1,'张三','语文' union all
    select 2,'张三','数学' union all
    select 3,'张三','物理' union all
    select 4,'李四','语文' union all
    select 5,'李四','数学' union all
    select 6,'李四','化学'-->(1) 2000: 不用函数的解决方案
    declare @i int, @max int, @sql varchar(max)
    select top 1 @i=1, @max=count(*) from #T group by 姓名 order by 2 desc
    while @i<=@max
    begin
    set @sql=isnull(@sql+'+max(case i when '+ltrim(@i)+' then '',''+','max(case i when '+ltrim(@i)+' then ')+'选修课程 else '''' end)'
    set @i=@i+1
    end
    exec ('select 姓名, 选修课程='+@sql+' from (select *,i=(select count(1) from #T where 姓名=a.姓名 and 选修课程<=a.选修课程) from #T a) t group by 姓名')
    /*
    姓名   选修课程
    ----   --------------
    李四   化学,数学,语文
    张三   数学,物理,语文
    */-->(2) 2005: 效率高可读性强
    select 姓名, 选修课程=(stuff((select ','+选修课程 from #T where 姓名=a.姓名 for xml path('')),1,1,'')) from #T a group by 姓名
    /*
    姓名   选修课程
    ----   --------------
    李四   语文,数学,化学
    张三   语文,数学,物理
    */