本帖最后由 bjcx994 于 2009-07-09 01:08:52 编辑

解决方案 »

  1.   


    我只能用多条SQL实现,目前还只能取一列,而不是所有列(但是再变通取多列估计是没有问题的),如果是SQL SERVER 2000 ,好像得用临时表
    declare @sql varchar(max)
    select @sql=''
    select @sql=@sql+cast(B as varchar(1000))+',' from ( 
    select  row_number() over( order by b) as id,   b  from t1 t2   where a=1 ) t
    select a , substring(@sql,1 ,len(@sql)-1) as b from t1  where a=1 group by a 
      

  2.   

    -- =========================================
    -- -----------t_mac 小编-------------
       ---希望有天成为大虾---- 
    -- =========================================if exists(select * from sys.objects where object_id=(object_ID(N'T1') ))
    drop table t1
    go
    create table T1 ( a int ,b int)
    insert T1  
    select 
    1, 5 union all select 
    1, 6 union all select 
    1 ,7 union all select 
    3, 2 union all select 
    3 ,5 union all select 
    3 ,4 union all select 
    5, 5 union all select 
    5 ,4 union all select 
    5 ,3
    go
    CREATE FUNCTION dbo.f_tb(@id int) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ',' + convert(varchar,b) FROM t1 WHERE a=@id 
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO SELECT a, CardName = dbo.f_tb(a) FROM t1 GROUP BY a 
    drop table t1
    drop function dbo.f_tb 
    go/*------------
    1 5,6,7
    3 2,5,4
    5 5,4,3
    -------*/
      

  3.   

    --各种字符串分函数--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
    --*/
    GO
      

  4.   

    只用一条SQL 语句是不是不可能实现的?
      

  5.   

    If not object_id('[tb]') is null
        Drop table [tb]
    Go
    Create table [tb]([Emplid] int,[EmplName] nvarchar(2))
    Insert tb
    Select 10,'张三' union all
    Select 11,'李四' union all
    Select 12,'王五'
    Go
    --Select * from tb-->SQL查询如下:
    select
       stuff((select ','+ltrim(Emplid) from tb for xml path('')),1,1,'') Emplid,
       stuff((select ','+ltrim([EmplName]) from tb for xml path('')),1,1,'') [EmplName] /*
    Emplid                           EmplName
    -------------------------------- -----------------------------------
    10,11,12                         张三,李四,王五(1 行受影响)*/
    找了个一句的例子
      

  6.   

    参考http://topic.csdn.net/u/20090708/12/a8225509-06c3-4fee-a6bd-81ccdd344bde.html
      

  7.   


    if exists(select * from sys.objects where object_id=(object_ID(N'T1') ))
    drop table t1
    go
    create table T1 ( a int ,b int)
    insert T1  
    select 
    1, 5 union all select 
    1, 6 union all select 
    1 ,7 union all select 
    3, 2 union all select 
    3 ,5 union all select 
    3 ,4 union all select 
    5, 5 union all select 
    5 ,4 union all select 
    5 ,3
    go
    select * from(select distinct a from T1) A cross apply
    (
    select b=STUFF(replace(replace(
    (
    select b from T1 as N
    where a=A.a 
    for XML auto
    ),'<N b="',','),'"/>',''),1,1,'')
    ) cc一条语句搞定,sql2000不能这样,2000以上版本都可以
      

  8.   

    下面两个实现方法会不会更明了些!select
     a ,b=stuff(
    replace(replace((select b from T1 as N   where  n.a=t1.a    for XML auto ),'<N b="',','),'"/>',''),1,1,null)
    from t1  group by aselect
    distinct  a ,b=stuff(
    replace(replace((select b from T1 as N   where  n.a=t1.a    for XML auto ),'<N b="',','),'"/>',''),1,1,null)
    from t1