表名:table1
字段名 姓名 课程 成绩
张三 语文 80
张三 英语 90
张三 数学 51
张三 化学 62
李四 语文 78
李四 英语 88
李四 数学 90
李四 物理 85
王五 语文 80
王五 英语 87
王五 数学 93
王五 物理 86
王五 化学 60
王五 音乐 75表名:table2
字段名 姓名 语文 英语 数学 化学 物理 音乐 
张三 80 90 51
李四 78 88 90 85
王五 80 87 93 60 86 75
我现在要把tble1的结构改成table2的的结构,而且还要把值添加过来
这个应该怎么写语句呢?

解决方案 »

  1.   

    create table tb(姓名 varchar(20),课程 varchar(10),成绩 int)
    insert tb select '张三','语文',80
    union all select '张三','英语',90
    union all select '张三','数学',51
    union all select '张三','化学',62
    union all select '李四','语文',78
    union all select '李四','英语',88
    union all select '李四','数学',90
    union all select '李四','物理',85
    union all select '王五','语文',80
    union all select '王五','英语',87
    union all select '王五','数学',93
    union all select '王五','物理',86
    union all select '王五','化学',60
    union all select '王五','音乐',75--select * from tbselect  姓名,
    max(case when 课程='语文' then 成绩  end) 语文,
    max(case when 课程='英语' then 成绩  end) 英语,
    max(case when 课程='数学' then 成绩  end) 数学,
    max(case when 课程='化学' then 成绩  end) 化学,
    max(case when 课程='物理' then 成绩  end) 物理,
    max(case when 课程='音乐' then 成绩  end) 音乐
    from tb group by 姓名drop table tb--结果
    姓名                   语文          英语          数学          化学          物理          音乐          
    -------------------- ----------- ----------- ----------- ----------- ----------- ----------- 
    李四                   78          88          90          NULL        85          NULL
    王五                   80          87          93          60          86          75
    张三                   80          90          51          62          NULL        NULL(所影响的行数为 3 行)
      

  2.   

    create table T(姓名 varchar(10), 课程 varchar(10), 成绩 int)
    insert T select '张三', '语文',80
    union all select  '张三', '英语',90
    union all select  '张三', '数学',51
    union all select  '张三', '化学',62
    union all select  '李四', '语文',78
    union all select  '李四', '英语',88
    union all select  '李四', '数学',90
    union all select  '李四', '物理',85
    union all select  '王五', '语文',80
    union all select  '王五', '英语',87
    union all select  '王五', '数学',93
    union all select  '王五', '物理',86
    union all select  '王五', '化学',60
    union all select  '王五', '音乐', 75declare @sql varchar(8000)
    set @sql='select 姓名,'
    select @sql=@sql+quotename(课程)+'=max(case when 课程='+quotename(课程, '''')+' then 成绩 end),'
    from T group by 课程select @sql=left(@sql, len(@sql)-1), @sql=@sql+' from T group by 姓名'
    exec(@sql)--result
    姓名         化学          数学          物理          音乐          英语          语文          
    ---------- ----------- ----------- ----------- ----------- ----------- ----------- 
    李四         NULL        90          85          NULL        88          78
    王五         60          93          86          75          87          80
    张三         62          51          NULL        NULL        90          80
      

  3.   

    楼上的
    declare @sql varchar(8000)
    set @sql='select 姓名,'
    select @sql=@sql+quotename(课程)+'=max(case when 课程='+quotename(课程, '''')+' then 成绩 end),'
    from T group by 课程select @sql=left(@sql, len(@sql)-1), @sql=@sql+' from T group by 姓名'
    exec(@sql)
    这段是什么意思,能不能解释一下?