如果,想把类似如下数据:
姓名      科目        成绩
张三                                         语文                                     80
张三                                         数学                                     90
张三                                         英语                                     80
李四                                         语文                                     75
李四                                         数学                                     95
......
变为
姓名     语文     数学     英语
张三        80       90      80
李四        75       95
......
其中,科目数不确定,请问如何实现?谢谢!

解决方案 »

  1.   

    create table t (name varchar(10),code varchar(10),cj int)
    go
    insert t values('张三','语文',80)
    insert t values('张三','数学',90)
    insert t values('张三','英语',80)
    insert t values('李四','语文',85)
    insert t values('张三','数学',95)godeclare @sql varchar(1000)set @sql = ''
    select @sql=@sql+',sum(case when code = '''+code +'''then cj else 0 end )as '+code
    from (select distinct code from t) a
    set @sql = 'select name  '+@sql+' from t group by name'
    --print @sql 
    exec (@sql)/*name       数学          英语          语文          
    ---------- ----------- ----------- ----------- 
    李四         0           0           85
    张三         185         80          80*/
    drop table t
      

  2.   


    不好意思,刚才有数据错误 
    create table t (name varchar(10),code varchar(10),cj int)
    go
    insert t values('张三','语文',80)
    insert t values('张三','数学',90)
    insert t values('张三','英语',80)
    insert t values('李四','语文',85)
    insert t values('李四','数学',95)godeclare @sql varchar(1000)set @sql = ''
    select @sql=@sql+',sum(case when code = '''+code +'''then cj else 0 end )as '+code
    from (select distinct code from t) a
    set @sql = 'select name  '+@sql+' from t group by name'
    --print @sql 
    exec (@sql)/*name       数学          英语          语文          
    ---------- ----------- ----------- ----------- 
    李四         95          0           85
    张三         90          80          80
    */
    drop table t
      

  3.   

    create table T(姓名 nvarchar(10),科目   nvarchar(10), 成绩 int)
    insert T select '张三','语文',80 
    insert T select '张三','数学',90 
    insert T select '张三','英语',80 
    insert T select '李四','语文',75 
    insert T select '李四','数学',95 go
    declare @s nvarchar(4000)
    set @s=''
    select 
    @s=@s+','+quotename(科目)+'=sum(case  when [科目]='+quotename(科目,'''')+' then 成绩 else 0 end)'
    from 
    T
    group by 科目exec ('select 姓名'+@s+' from T 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 T 
    group by 姓名姓名         数学          英语          语文          
    ---------- ----------- ----------- ----------- 
    李四         95          0           75
    张三         90          80          80(所影响的行数为 2 行)