如何将下表的数据行数据转换成列数据SQL语句,例:
表:
--姓名     科目     分数
--张三   英语    10
--张三   数学    90
--张三   语文    100 输出结果
--姓名  英语  语文  数学
--张三   10   100   90

解决方案 »

  1.   

    1. 行列转换--普通假设有张学生成绩表(CJ)如下
    Name    Subject     Result
    张三    语文        80
    张三    数学        90
    张三    物理        85
    李四    语文        85
    李四    数学        92
    李四    物理        82想变成    
    姓名   语文   数学   物理
    张三   80     90     85
    李四   85     92     82declare @sql varchar(4000)
    set @sql = 'select Name'
    select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
     from (select distinct Subject from CJ) as a
    select @sql = @sql+' from test group by name'
    exec(@sql)
      

  2.   

    create table tb(姓名 varchar(10),科目 varchar(10),分数 int)
    insert into tb select '张三','英语',10
    union all select '张三','数学',90
    union all select '张三','语文',100--动态写法
    declare @sql varchar(8000)
    set @sql='select 姓名'
    select @sql=@sql+',['+科目+']=sum(case 科目 when '''+科目+''' then 分数 else 0 end)' from tb group by 科目
    exec(@sql+' from tb group by 姓名')--静态写法
    select 姓名,
           [英语]=sum(case 科目 when '英语' then 分数 else 0 end),
           [语文]=sum(case 科目 when '语文' then 分数 else 0 end),
           [数学]=sum(case 科目 when '数学' then 分数 else 0 end)
    from tb
    group by 姓名
    drop table tb
      

  3.   

    假设有张学生成绩表(CJ)如下
    Name    Subject     Result
    张三    语文        80
    张三    数学        90
    张三    物理        85
    李四    语文        85
    李四    数学        92
    李四    物理        82想变成    
    姓名   语文   数学   物理
    张三   80     90     85
    李四   85     92     82declare @sql varchar(4000)
    set @sql = ''            
    select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
     from (select distinct Subject from CJ) as a
    select @sql ='select Name '+ @sql+' from test group by name'
    exec(@sql)