if object_id('tb') is not null? 
drop table tb
go
create table tb(姓名 varchar(10),课程 varchar(10),分数 int)
insert into tb values('张三','语文',74)
insert into tb values('张三','数学',83)
insert into tb values('张三','物理',93)
insert into tb values('李四','语文',74)
insert into tb values('李四','数学',84)
insert into tb values('李四','物理',94)
-- 以下两段代码, 是将列表转换为交叉表, 可是对于这两段代码的执行过程, 我看不太懂,
-- 请高手帮忙解析一下, 谢谢declare @sql varchar(500)
set @sql='select 姓名'
select @sql = @sql + ',max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'
from(select distinct 课程 from tb) a--同from tb group by课程,默认按课程名排序
set @sql=@sql+' from tb group by 姓名'
exec(@sql)
declare @sql varchar(8000)
select @sql=isnull(@sql+',','')+' max(case 课程 when '''+课程+''' then 分数 else 0 end) ['+课程+']'
from(select distinct 课程 from tb) as a 
set @sql='select 姓名,'+@sql+' from tb group by 姓名'
exec(@sql)

解决方案 »

  1.   

    在exec(@sql)加一句 print @sql,看看,最好拼接出来的sql,最终就是按学生分组,按课程构建交叉表.
      

  2.   


    select 姓名
    ,max(case 课程 when '数学' then 分数 else 0 end)[数学]
    ,max(case 课程 when '物理' then 分数 else 0 end)[物理]
    ,max(case 课程 when '语文' then 分数 else 0 end)[语文]
    from tb group by 姓名 --按姓名分组
      

  3.   


    create table tb(姓名 varchar(10),课程 varchar(10),分数 int)
    insert into tb values('张三','语文',74)
    insert into tb values('张三','数学',83)
    insert into tb values('张三','物理',93)
    insert into tb values('李四','语文',74)
    insert into tb values('李四','数学',84)
    insert into tb values('李四','物理',94)
    godeclare @sql varchar(500)
    set @sql='select 姓名'
    select @sql = @sql + ',max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'
    --变量的赋值方式有 select @sql = @sql + col from tb 这样的形式,这里其中的 max(case ... when ... else ... end)
    --是为了拼接select语句,可以print出来看看
    from(select distinct 课程 from tb) a  --这里是为了拼接查询课程的列名,如果不distinct会出现重复情况
    set @sql=@sql+' from tb group by 姓名'
    print @sql
    /*
    select 姓名
    ,max(case 课程 when '数学' then 分数 else 0 end)[数学]   --1
    ,max(case 课程 when '物理' then 分数 else 0 end)[物理]   --2
    ,max(case 课程 when '语文' then 分数 else 0 end)[语文]   --3 这三段联合起来就是上方@sql赋值拼接的结果
    from tb group by 姓名
    */
    exec(@sql)drop table tb
      

  4.   


    create table tb(姓名 varchar(10),课程 varchar(10),分数 int)
    insert into tb values('张三','语文',74)
    insert into tb values('张三','数学',83)
    insert into tb values('张三','物理',93)
    insert into tb values('李四','语文',74)
    insert into tb values('李四','数学',84)
    insert into tb values('李四','物理',94)declare @sql varchar(8000)
    select @sql=isnull(@sql+',','')+' max(case 课程 when '''+课程+''' then 分数 else 0 end) ['+课程+']'
    --这个地方注意的一点就是给了@sql变量后,值是NULL,第一个字符串加的时候 @sql+',' 也是NULL,直接是max ...
    --第二次进来时,因为@sql有具体的值,所以为 @sql+','
    --最后的形式
    /*
    max(case 课程 when '数学' then 分数 else 0 end) [数学]
    , max(case 课程 when '物理' then 分数 else 0 end) [物理]
    , max(case 课程 when '语文' then 分数 else 0 end) [语文]
    */
    --注意上方的 , 号,第一次没有,后边都有
    from(select distinct 课程 from tb) as a  
    set @sql='select 姓名,'+@sql+' from tb group by 姓名'
    --select 姓名,  这个,号一定要加,如果select后没有姓名这个字段,可以不用加
    print @sql
    exec(@sql)drop table tb