name         date          nr
  x1        2006-01-01      aaaa
  x1        2006-01-02      bbbb 
  x3        2006-01-03      dddd 转换为如下格式name  2006-01-01  2006-01-02  2006-01-03 
x1       aaaa       bbbb 
x3                            dddd     在sqlserver有什么方法可解决此问题?

解决方案 »

  1.   

    declare @s varchar(2000)
    set @s = 'select [name]'
    select distinct @s = @s + ', min(case when [date] = ''' + [date] + ''' then nr end) as [' + [date] + ']'
    from tablename
    order by [date]
    set @s = ' from tablename group by [name]'
    exec(@s)
      

  2.   

    SQL语句之普通行列转换 
     
    假设有张学生成绩表(tb_rowtocol)如下
    Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94想变成 
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94declare @sql varchar(4000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
    from (select distinct Subject from rowtocol) as a
    set @sql = @sql + ' from rowtocol group by name'
    exec(@sql) 
     
    如果上述两表互相换一下:即
    表名(cj)
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94想变成 Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94select 姓名 as Name,'语文' as Subject,语文 as Result from CJ union
    select 姓名 as Name,'数学' as Subject,数学 as Result from CJ union
    select 姓名 as Name,'物理' as Subject,物理 as Result from CJ
    order by 姓名 desc 
     
      

  3.   

    if object_id('tablename')is not null drop table tablename
    select 'x1'as [name], '2006-01-01' as [date], 'aaaa' as nr
    into tablename
    union select 'x1', '2006-01-02', 'bbbb'
    union select 'x3', '2006-01-03', 'dddd'
    -----------------------------------------------------
    declare @s varchar(2000)
    set @s = 'select [name]'
    select @s = @s + ', min(case when [date] = ''' + [date] + ''' then nr end) as [' + [date] + ']'
    from (select distinct[date] from tablename) a
    set @s = @s + ' from tablename group by [name]'
    exec(@s)
    /*
    name 2006-01-01 2006-01-02 2006-01-03 
    ---- ---------- ---------- ---------- 
    x1   aaaa       bbbb       NULL
    x3   NULL       NULL       dddd*/
    -----------------------------------------------------
    drop table tablename
      

  4.   

    create table table1(name varchar(10),date varchar(10),nr varchar(10))
    insert into table1(name,date,nr)
    select 'x1','2006-01-01','aaaa'
    union all select 'x1','2006-01-02','bbbb'
    union all select 'x3','2006-01-03','dddd'
    declare @sql varchar(8000)
    set @sql=''
    select @sql=@sql+',max(case when date = '''+date+''''+' then nr end) as '''+date+''''
    from table1
    exec('select distinct name '+@sql+' from table1 group by name')