我的表完整结构是这样的 
id                                    mname  cname      riqi 
{68AC3023-7BA8-4F86-A806-91FC7A93BE57} DN      电脑        2008-1-9 
{10AE907E-72A0-4B9E-B768-9C9877A42658} XZT100      写字台  2008-3-6 
{64DD0A9A-4174-47DC-896F-5CA6C7432EFC} DN100      电脑      2008-6-20 
{68AC3023-7BA8-4F86-A806-91FC7A93BE57} XZT      写字台      2008-6-2 
{402D2590-72F1-4C9D-AE67-B58C0FCE6EA2} JSJ      计算机    2008-4-20 
{502D2591-72F1-4C9D-AE67-B58C0FCE6EA2}          C语言      2008-3-20 把这个表更新成如下表: 
id                                    mname          cname      riqi 
{68AC3023-7BA8-4F86-A806-91FC7A93BE57} DN,DN100        电脑        2008-1-9 
{10AE907E-72A0-4B9E-B768-9C9877A42658} XZT100,XZT      写字台      2008-3-6 
{402D2590-72F1-4C9D-AE67-B58C0FCE6EA2} JSJ              计算机      2008-4-20 
{502D2591-72F1-4C9D-AE67-B58C0FCE6EA2}                  C语言      2008-3-20 
刚问了,没有答案,大家给我一个答案,会给分的。

解决方案 »

  1.   

    --各种字符串分函数--3.3.1 使用游标法进行字符串合并处理的示例。
    --处理的数据
    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--合并处理
    --定义结果集表变量
    DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定义游标并进行合并处理
    DECLARE tb CURSOR LOCAL
    FOR
    SELECT col1,col2 FROM tb ORDER BY  col1,col2
    DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
    OPEN tb
    FETCH tb INTO @col1,@col2
    SELECT @col1_old=@col1,@s=''
    WHILE @@FETCH_STATUS=0
    BEGIN
        IF @col1=@col1_old
            SELECT @s=@s+','+CAST(@col2 as varchar)
        ELSE
        BEGIN
            INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
            SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
        END
        FETCH tb INTO @col1,@col2
    END
    INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
    CLOSE tb
    DEALLOCATE tb
    --显示结果并删除测试数据
    SELECT * FROM @t
    DROP TABLE tb
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    GO
    /*==============================================*/
    --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/*==============================================*/
    --3.3.3 使用临时表实现字符串合并处理的示例
    --处理的数据
    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--合并处理
    SELECT col1,col2=CAST(col2 as varchar(100)) 
    INTO #t FROM tb
    ORDER BY col1,col2
    DECLARE @col1 varchar(10),@col2 varchar(100)
    UPDATE #t SET 
        @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
        @col1=col1,
        col2=@col2
    SELECT * FROM #t
    /*--更新处理后的临时表
    col1       col2
    ---------- -------------
    a          1
    a          1,2
    b          1
    b          1,2
    b          1,2,3
    --*/
    --得到最终结果
    SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    --删除测试
    DROP TABLE tb,#t
    GO
    /*==============================================*/--3.3.4.1 每组 <=2 条记录的合并
    --处理的数据
    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 'c',3--合并处理
    SELECT col1,
        col2=CAST(MIN(col2) as varchar)
            +CASE 
                WHEN COUNT(*)=1 THEN ''
                ELSE ','+CAST(MAX(col2) as varchar)
            END
    FROM tb
    GROUP BY col1
    DROP TABLE tb
    /*--结果
    col1       col2      
    ---------- ----------
    a          1,2
    b          1,2
    c          3
    --*/--3.3.4.2 每组 <=3 条记录的合并
    --处理的数据
    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
    UNION ALL SELECT 'c',3--合并处理
    SELECT col1,
        col2=CAST(MIN(col2) as varchar)
            +CASE 
                WHEN COUNT(*)=3 THEN ','
                    +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
                ELSE ''
            END
            +CASE 
                WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
                ELSE ''
            END
    FROM tb a
    GROUP BY col1
    DROP TABLE tb
    /*--结果
    col1       col2
    ---------- ------------
    a          1,2
    b          1,2,3
    c          3
    --*/
    GODECLARE @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--结果
    ----------- ----------------
    1           aa,bb
    2           aaa,bbb,ccc
      

  2.   

    参考:
    合并分拆表_整理贴1
    http://topic.csdn.net/u/20080612/22/c850499f-bce3-4877-82d5-af2357857872.html
      

  3.   

    --> 测试数据: [TB]
    if object_id('[TB]') is not null drop table [TB]
    create table [TB] (id varchar(38),mname varchar(6),cname varchar(9),riqi datetime)
    insert into [TB]
    select '{68AC3023-7BA8-4F86-A806-91FC7A93BE57}','DN','电脑','2008-1-9' union all
    select '{10AE907E-72A0-4B9E-B768-9C9877A42658}','XZT100','写字台','2008-3-6' union all
    select '{64DD0A9A-4174-47DC-896F-5CA6C7432EFC}','DN100','电脑','2008-6-20' union all
    select '{68AC3023-7BA8-4F86-A806-91FC7A93BE57}','XZT','写字台','2008-6-2' union all
    select '{402D2590-72F1-4C9D-AE67-B58C0FCE6EA2}','JSJ','计算机','2008-4-20' union all
    select '{502D2591-72F1-4C9D-AE67-B58C0FCE6EA2}','C语言','2008-3-20',nullselect id,dbo.fn_getname(id,0) as mname,dbo.fn_getname(id,1) as cname,riqi from [TB]
    /*
    ----------------
    {68AC3023-7BA8-4F86-A806-91FC7A93BE57} DN,XZT 电脑,写字台 2008-01-09 00:00:00.000
    {10AE907E-72A0-4B9E-B768-9C9877A42658} XZT100 写字台 2008-03-06 00:00:00.000
    {64DD0A9A-4174-47DC-896F-5CA6C7432EFC} DN100 电脑 2008-06-20 00:00:00.000
    {68AC3023-7BA8-4F86-A806-91FC7A93BE57} DN,XZT 电脑,写字台 2008-06-02 00:00:00.000
    {402D2590-72F1-4C9D-AE67-B58C0FCE6EA2} JSJ 计算机 2008-04-20 00:00:00.000
    {502D2591-72F1-4C9D-AE67-B58C0FCE6EA2} C语言 2008-3-20 NULL
    */create function fn_getname(@str varchar(1000),@id int)
    returns varchar(8000)
    begin
        declare @s varchar(8000) set @s=''
        if @id=0
            select @s=@s+mname+',' from tb where id=@str 
        else
            select @s=@s+cname+',' from tb where id=@str
        if len(@s)>0 set @s=left(@s,len(@s)-1)
        return @s
    end
      

  4.   

    --> 测试数据: [TB]
    if object_id('[TB]') is not null drop table [TB]
    create table [TB] (id varchar(38),mname varchar(6),cname varchar(9),riqi datetime)
    insert into [TB]
    select '{68AC3023-7BA8-4F86-A806-91FC7A93BE57}','DN','电脑','2008-1-9' union all
    select '{10AE907E-72A0-4B9E-B768-9C9877A42658}','XZT100','写字台','2008-3-6' union all
    select '{64DD0A9A-4174-47DC-896F-5CA6C7432EFC}','DN100','电脑','2008-6-20' union all
    select '{68AC3023-7BA8-4F86-A806-91FC7A93BE57}','XZT','写字台','2008-6-2' union all
    select '{402D2590-72F1-4C9D-AE67-B58C0FCE6EA2}','JSJ','计算机','2008-4-20' union all
    select '{502D2591-72F1-4C9D-AE67-B58C0FCE6EA2}','C语言','2008-3-20',nullselect id,dbo.fn_getname(id,0) as mname,dbo.fn_getname(id,1) as cname,min(riqi) as riqi from [TB] group by id
    /*
    ----------------
    {68AC3023-7BA8-4F86-A806-91FC7A93BE57} DN,XZT 电脑,写字台 2008-01-09 00:00:00.000
    {64DD0A9A-4174-47DC-896F-5CA6C7432EFC} DN100 电脑 2008-06-20 00:00:00.000
    {502D2591-72F1-4C9D-AE67-B58C0FCE6EA2} C语言 2008-3-20 NULL
    {402D2590-72F1-4C9D-AE67-B58C0FCE6EA2} JSJ 计算机 2008-04-20 00:00:00.000
    {10AE907E-72A0-4B9E-B768-9C9877A42658} XZT100 写字台 2008-03-06 00:00:00.000
    */create function fn_getname(@str varchar(1000),@id int)
    returns varchar(8000)
    begin
        declare @s varchar(8000) set @s=''
        if @id=0
            select @s=@s+isnull(mname,'')+',' from tb where id=@str 
        else
            select @s=@s+isnull(cname,'')+',' from tb where id=@str
        if len(@s)>0 set @s=left(@s,len(@s)-1)
        return @s
    end
      

  5.   

    愁死了,{10AE907E-72A0-4B9E-B768-9C9877A42658} XZT100,XZT 这个数据哪来的?
      

  6.   

    看来是这样:
    --> 测试数据: [TB]
    if object_id('[TB]') is not null drop table [TB]
    create table [TB] (id varchar(38),mname varchar(6),cname varchar(9),riqi datetime)
    insert into [TB]
    select '{68AC3023-7BA8-4F86-A806-91FC7A93BE57}','DN','电脑','2008-1-9' union all
    select '{10AE907E-72A0-4B9E-B768-9C9877A42658}','XZT100','写字台','2008-3-6' union all
    select '{64DD0A9A-4174-47DC-896F-5CA6C7432EFC}','DN100','电脑','2008-6-20' union all
    select '{68AC3023-7BA8-4F86-A806-91FC7A93BE57}','XZT','写字台','2008-6-2' union all
    select '{402D2590-72F1-4C9D-AE67-B58C0FCE6EA2}','JSJ','计算机','2008-4-20' union all
    select '{502D2591-72F1-4C9D-AE67-B58C0FCE6EA2}','','C语言','2008-3-20'select (select top 1 id from [tb] where riqi=min(a.riqi) and cname=a.cname) as id,
    dbo.fn_getname2(cname) as mname,cname,min(riqi) as riqi from [TB] a  group by cname
    order by min(riqi) /*
    ----------------
    {68AC3023-7BA8-4F86-A806-91FC7A93BE57} DN,DN100 电脑 2008-01-09 00:00:00.000
    {10AE907E-72A0-4B9E-B768-9C9877A42658} XZT100,XZT 写字台 2008-03-06 00:00:00.000
    {502D2591-72F1-4C9D-AE67-B58C0FCE6EA2} C语言 2008-03-20 00:00:00.000
    {402D2590-72F1-4C9D-AE67-B58C0FCE6EA2} JSJ 计算机 2008-04-20 00:00:00.000
    */create function fn_getname2(@str varchar(1000))
    returns varchar(8000)
    begin
        declare @s varchar(8000) set @s=''
        select @s=@s+isnull(mname,'')+',' from tb where cname=@str 
        if len(@s)>0 set @s=left(@s,len(@s)-1)
        return @s
    end
      

  7.   


    不用函数也可以的select a.id,a.mname+isnull(', '+b.mname,'')mname,a.cname,a.riqi from #T a
    left join #T b on a.cname=b.cname and a.riqi<b.riqi
    inner join (select cname ,min(riqi) riqi
    from #T group by cname) bb on a.cname=bb.cname and a.riqi=bb.riqi
    order by riqi