表中数据如下:
a       b               c       d       e
------------------------------------------------------------------------
17 11000004 1 19 Ablation for irregular heart beat
18 11000004 1 19 Endoscopic surgery for scoliosis想得到结果:
a       b               c       d       e
--------------------------------------------------------------------------
17 11000004 1 19,19 Ablation for irregular heart beat,Endoscopic surgery for scoliosis也就是说把B相同的两条纪录,删除其中一条,把D,E两个字段的值合并到一起,保存到d,e中。
   

解决方案 »

  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 @[email protected],@s=''
    WHILE @@FETCH_STATUS=0
    BEGIN
    IF @[email protected]_old
    SELECT @[email protected]+','+CAST(@col2 as varchar)
    ELSE
    BEGIN
    INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
    SELECT @s=','+CAST(@col2 as varchar),@[email protected]
    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 @[email protected]+','+CAST(col2 as varchar)
    FROM tb
    WHERE [email protected]
    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,
    [email protected]
    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
    --*/
    GO
      

  2.   

    合并,
    http://topic.csdn.net/u/20080612/22/c850499f-bce3-4877-82d5-af2357857872.html
      

  3.   

    --2005解决方案--liangCK小梁 于2008-07-17
    --> 生成测试数据: #T
    if object_id('tempdb.dbo.#T') is not null drop table #T
    create table #T (a int,b int,c int,d int,e varchar(50))
    insert into #T
    select 17,11000004,1,19,'Ablation for irregular heart beat' union all
    select 18,11000004,1,19,'Endoscopic surgery for scoliosis'select min(a) a,
           b,c,
           stuff((select ','+ltrim(d) from #T where b=t.b and c=t.c for xml path('')),1,1,'') d,
           stuff((select ','+e from #T where b=t.b and c=t.c for xml path('')),1,1,'') e
    from #T t
    group by b,c/*
    a           b           c           d                                                                                                                                                                                                                                                                e
    ----------- ----------- ----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    17          11000004    1           19,19                                                                                                                                                                                                                                                            Ablation for irregular heart beat,Endoscopic surgery for scoliosis(1 行受影响)*/
      

  4.   

    if not object_id('Tab') is null
        drop table Tab
    Go
    Create table Tab([Col1] int,[Col2] nvarchar(1))
    Insert Tab
    select 1,N'a' union all
    select 1,N'b' union all
    select 1,N'c' union all
    select 2,N'd' union all
    select 2,N'e' union all
    select 3,N'f'
    Gogo
    if object_id('F_Str') is not null
        drop function F_Str
    go
    create function F_Str(@Col1 int)
    returns nvarchar(100)
    as
    begin
        declare @S nvarchar(100)
        select @S=isnull(@S+',','')+Col2 from Tab where [email protected]
        return @S
    end
    go
    Select distinct Col1,Col2=dbo.F_Str(Col1) from Tabgo生成结果:
    /*
    Col1        COl2
    ----------- ------------
    1           a,b,c
    2           d,e
    3           f(3 行受影响)
    */
      

  5.   

    CREATE TABLE TB(A INT,B int,C INT,D INT,E VARCHAR(100) )
    INSERT TB SELECT 17,11000004,1,19,'Ablation for irregular heart beat' 
    UNION ALL SELECT 18,11000004,1,19,'Endoscopic surgery for scoliosis' CREATE FUNCTION F_UNION (@FIELD varchar(10),@V INT)
    RETURNS VARCHAR(200)
    AS
    BEGIN
    DECLARE @RE varchar(100)
    SET @RE=''
    SELECT @[email protected]+','+CASE WHEN @V=0 THEN CAST(D as varchar) ELSE CAST(E as varchar) END
    FROM TB
    WHERE [email protected]
    RETURN(STUFF(@RE,1,1,''))
    END
    GOSELECT TOP 1 A,B,C,D=dbo.F_UNION(B,0),E=dbo.F_UNION(B,1) FROM TB ORDER BY A /*
    A           B           C           D                   E       
    ----------- ----------- ----------- ------------ ---------------------------------------------------------------- 
    17          11000004    1           19,19       Ablation for irregular heart b,Endoscopic surgery for scolios(所影响的行数为 1 行)
    */
      

  6.   

    CREATE TABLE TB(A INT,B int,C INT,D INT,E VARCHAR(100) )
    INSERT TB SELECT 17,11000004,1,19,'Ablation for irregular heart beat' 
    UNION ALL SELECT 18,11000004,1,19,'Endoscopic surgery for scoliosis' DECLARE @A VARCHAR(10)
    DECLARE @B VARCHAR(80)SELECT @A=ISNULL(@A,'')+','+CONVERT(VARCHAR,D) FROM TB
    SELECT @B=ISNULL(@B,'')+','+E FROM TBSELECT TOP 1 A,B,C,STUFF(@A,1,1,'')AS D,STUFF(@B,1,1,'')AS E FROM TB /*
    A           B           C           D         E                                                                               
    ----------- ----------- ----------- --------- ----------------------------------------------------------------------- 
    17          11000004    1           19,19     Ablation for irregular heart beat,Endoscopic surgery for scoliosis(所影响的行数为 1 行)*/
      

  7.   

    --楼上的速度太快了,写完后发现与lgxyz的思路大致相同 
    create table tb(a int,b int,c int ,d int ,e varchar(300))insert into tb select 17,11000004, 1, 19, 'Ablation for irregular heart beat'
    union all select 18, 11000004 ,1 ,19 ,'Endoscopic surgery for scoliosis'
    CREATE FUNCTION dbo.f_str(@de char(1),@col1 int)
    RETURNS varchar(1000)
    AS
    BEGIN
        DECLARE @re varchar(100)
        SET @re=''
        SELECT @[email protected]+','+ CASE @de WHEN 'd' THEN CAST(d as varchar) ELSE CAST(e as varchar) END
        FROM tb
        WHERE [email protected] 
        RETURN(STUFF(@re,1,1,''))
    END
    GOselect top 1 a,b,c,d=dbo.f_str('d',b),e=dbo.f_str('e',b) from tb
      

  8.   

    OK!测试通过了。试试吧。觉得好就多加点分 exec decord_a '[email protected]@[email protected]@f5' 
    ---这个存储过程可以提取包含任意个@字符的字符串,通过临时表输出,使用查询分析器或前台数据集都可以得到结果。 create procedure decord_A 
    @STR VARCHAR(100) 
    AS 
    declare @n int,@SN INT 
    SET @N=LEN(@STR)-LEN(REPLACE(@STR,'@',''))--提取字符@的个数 
    SET @SN=1 
    CREATE table #TEMP(SN INT,CSTR VARCHAR(100)) 
    WHILE @SN<[email protected] 
    BEGIN 
    INSERT INTO #TEMP SELECT @SN,LEFT(@STR,CHARINDEX('@',@STR)-1) 
    SELECT @[email protected]+1,@STR=SUBSTRING(@STR,CHARINDEX('@',@STR)+1,100) 
    END 
    INSERT INTO #TEMP SELECT @N+1,@STR 
    SELECT *FROM #TEMP order by sn 
    GO
      

  9.   

    http://topic.csdn.net/t/20040505/07/3033017.html
      

  10.   

    --各种字符串分函数--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 @[email protected],@s=''
    WHILE @@FETCH_STATUS=0
    BEGIN
        IF @[email protected]_old
            SELECT @[email protected]+','+CAST(@col2 as varchar)
        ELSE
        BEGIN
            INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
            SELECT @s=','+CAST(@col2 as varchar),@[email protected]
        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 @[email protected]+','+CAST(col2 as varchar)
        FROM tb
        WHERE [email protected]
        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,
        [email protected]
    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
    --*/
    GO
      

  11.   

    if object_id('t') is not null
      drop table t
    go
    create TABLE t (A INT,B int,C INT,D INT,E VARCHAR(100) )
    INSERT into t 
    SELECT 17,11000004,1,19,'Ablation for irregular heart beat' 
    UNION ALL 
    SELECT 18,11000004,1,19,'Endoscopic surgery for scoliosis'
    UNION ALL 
    SELECT 19,11000005,1,20,'11111111111'
    UNION ALL 
    SELECT 20,11000005,1,20,'22222222222'
    goif object_id('temp') is not null
      drop table temp
    go
    select t1.A [A], t1.B [B], t1.C [C], t1.D [D], 
           convert(varchar(20),t2.D)+' '+t1.E+' '+t2.E [E] into [temp] from t t1
    left join t t2 on(t2.[B]=t1.[B])
    where t2.A>t1.Adrop table texec sp_rename temp, tselect * from t
      

  12.   

    --> --> (Roy)生成測試數據
     
    set nocount on;
    if not object_id('T') is null
    drop table T
    Go
    set nocount on;
    Create table T([a] int,[b] int,[c] int,[d] int,[e] nvarchar(33))
    Insert T
    select 17,11000004,1,19,N'Ablation for irregular heart beat' union all
    select 18,11000004,1,19,N'Endoscopic surgery for scoliosis'
    Go
    if not object_id('F_str') is null
    drop function F_str
    go
    create function F_str(@b int,@c int)
    returns nvarchar(200)
    as
    begin
    declare @s nvarchar(200),@s2 nvarchar(200)
    Select @s=isnull(@s+',','')+rtrim([d]),@s2=isnull(@s2+',','')+[e] from T where [b][email protected] and [c][email protected]
    return (@s+' '[email protected])
    end
    go
    select min([a])[a],[b],[c],dbo.F_str([b],[c])[e] from t group by [b],[c]/*
    a           b           c           e
    ----------- ----------- ----------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    17          11000004    1           19,19 Ablation for irregular heart beat,Endoscopic surgery for scoliosis
    */
      

  13.   

    05时用xml;
    --> --> (Roy)生成測試數據
     
    set nocount on;
    if not object_id('T') is null
    drop table T
    Go
    set nocount on;
    Create table T([a] int,[b] int,[c] int,[d] int,[e] nvarchar(33))
    Insert T
    select 17,11000004,1,19,N'Ablation for irregular heart beat' union all
    select 18,11000004,1,19,N'Endoscopic surgery for scoliosis'
    Go
    select 
        a.*,
    [e]=STUFF(b.Col.query('(/d/text())').value('.', 'nvarchar(max)'), 1, 1, N'')+' '
    +STUFF(b.Col.query('(/e/text())').value('.', 'nvarchar(max)'), 1, 1, N'')
    from 
        (select distinct min([a])[a],[b],[c] from T group by [b],[c]) a
    Cross apply
        (select Col=(select [d]=N','+rtrim([d]),[e]=N','+[e] from T where [b]=a.[b] and [c]=a.[c] For XML PATH(''), TYPE))ba           b           c           e
    ----------- ----------- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    17          11000004    1           19,19 Ablation for irregular heart beat,Endoscopic surgery for scoliosis