有如下一个表:
tableA 
 id         riqi
0003   20090201
0003   20090202
0004   20090202
0004   20090204
如何转换成:
id         riqi
0003       20090201 20090202
0004       20090202 20090204或者
riqi       id
20090201  0003
20090202  0003 0004
20090204  0004

解决方案 »

  1.   

    create table tableA(id nvarchar(20),riqi nvarchar(20))
    goinsert into tableA 
    select '0003','20090201' union all    
    select '0003','20090202'  union all   
    select '0004','20090202'  union all   
    select '0004','20090204'  
    go
    drop function dbo.getstr
    create function dbo.getstr(@id nvarchar(20))
    returns nvarchar(200)
    as
    begin
    declare @str as nvarchar(200)
    select @str=isnull(@str,'')+riqi+' ' from tableA where id=@id
    return  @str
    end
    go
    select distinct id,dbo.getstr(id) as riqi from tableA
     
    --
    id                   riqi                                                                                                                                                                                                     
    -------------------- -------------------
    0003                 20090201 20090202 
    0004                 20090202 20090204 
      

  2.   

    兄台:我执行报错:消息 111,级别 15,状态 1,第 3 行
    'CREATE FUNCTION' 必须是查询批次中的第一个语句。
    消息 137,级别 15,状态 2,第 8 行
    必须声明标量变量 "@id"。
    消息 178,级别 15,状态 1,第 9 行
    在此上下文中不能使用带有返回值的 RETURN 语句。
    消息 4121,级别 16,状态 1,第 1 行
    找不到列 "dbo" 或用户定义的函数或聚合 "dbo.getstr",或者名称不明确。
      

  3.   

    if object_id('tableA') is not null
    drop table tableA
    go
    create table tableA(id nvarchar(20),riqi nvarchar(20))
    goinsert into tableA 
    select '0003','20090201' union all    
    select '0003','20090202'  union all   
    select '0004','20090202'  union all   
    select '0004','20090204'  
    goif object_id('dbo.getstr') is not null
    drop function dbo.getstr
    go 
    create function dbo.getstr(@id nvarchar(20))
    returns nvarchar(200)
    as
    begin
    declare @str as nvarchar(200)
    select @str=isnull(@str,'')+riqi+' ' from tableA where id=@id
    return  @str
    end
    go
    select distinct id,dbo.getstr(id) as riqi from tableA
     
      

  4.   

    /*
    标题:按某字段合并字符串之一(简单合并)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-11-06
    地点:广东深圳描述:将如下形式的数据按id字段合并value字段。
    id    value
    ----- ------
    1     aa
    1     bb
    2     aaa
    2     bbb
    2     ccc
    需要得到结果:
    id     value
    ------ -----------
    1      aa,bb
    2      aaa,bbb,ccc
    即:group by id, 求 value 的和(字符串相加)
    */
    --1、sql2000中只能用自定义的函数解决
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    gocreate function dbo.f_str(@id int) returns varchar(100)
    as
    begin
        declare @str varchar(1000)
        set @str = ''
        select @str = @str + ',' + cast(value as varchar) from tb where id = @id
        set @str = right(@str , len(@str) - 1)
        return @str
    end
    go--调用函数
    select id , value = dbo.f_str(id) from tb group by iddrop function dbo.f_str
    drop table tb
    --2、sql2005中的方法
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    goselect id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
    from tb
    group by iddrop table tb
    --3、使用游标合并数据
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    go
    declare @t table(id int,value varchar(100))--定义结果集表变量
    --定义游标并进行合并处理
    declare my_cursor cursor local for
    select id , value from tb
    declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
    open my_cursor
    fetch my_cursor into @id , @value
    select @id_old = @id , @s=''
    while @@FETCH_STATUS = 0
    begin
        if @id = @id_old
           select @s = @s + ',' + cast(@value as varchar)
        else
          begin
            insert @t values(@id_old , stuff(@s,1,1,''))
            select @s = ',' + cast(@value as varchar) , @id_old = @id
          end
        fetch my_cursor into @id , @value
    END
    insert @t values(@id_old , stuff(@s,1,1,''))
    close my_cursor
    deallocate my_cursorselect * from @t
    drop table tb
      

  5.   

    if object_id('[tableA]') is not null drop table [tableA]
    go
    create table [tableA]([id] varchar(4),[riqi] varchar(10))
    insert [tableA]
    select '0003','20090201' union all
    select '0003','20090202' union all
    select '0004','20090202' union all
    select '0004','20090204'select
      riqi,
      stuff((select ' '+id from tableA where riqi=t.riqi for xml path('')),1,1,'') as id 
    from 
      tableA t
    group by 
      riqi--测试结果:
    /*
    riqi       id
    ---------- --------------------------------------
    20090201   0003
    20090202   0003 0004
    20090204   0004(3 行受影响)
    */