我的原表格 grades 是这样的
name  subject  grade
张三    语文    72
张三    数学    100
张三    英语    75
李四…………………
……………………
select  name 姓名,
  max(case subject when '语文' then grade else 0 end) 语文,
  max(case subject when '数学' then grade else 0 end) 数学,
  max(case subject when '英语' then grade else 0 end) 英语
from grades 
group by name
这上面的是行转列 成功之后 表格式这样的
----------------------------------------
姓名   语文  数学  英语 
张三    72   100    75  
李四    55   66     77
王五    78   69     53
赵六    21   37     58
…………
之后我希望 只需要 查TOP前面几条记录  用的办法是

select top 3 * from grades where exists(
select  name 姓名,
  max(case subject when '语文' then grade else 0 end) 语文,
  max(case subject when '数学' then grade else 0 end) 数学,
  max(case subject when '英语' then grade else 0 end) 英语
from grades 
group by name
)
结果却

name  subject  grade
张三    语文    72
张三    数学    100
张三    英语    75相当于 又变回来了。跪求高手指点!

解决方案 »

  1.   

    select top 3 * from (select  name 姓名,
      max(case subject when '语文' then grade else 0 end) 语文,
      max(case subject when '数学' then grade else 0 end) 数学,
      max(case subject when '英语' then grade else 0 end) 英语
    from grades 
    group by name)t
      

  2.   

    还能再问个问题么  这么将下面的这个分页查询 和 行转列 结合起来查4-6条的记录呢  普通top3 的话 就只能前3条记录吧
    select top 3 * 
    from grades
    where name not in
    (select top 3 name from grades order by name)
    order by nameselect  name 姓名,
      max(case subject when '语文' then grade else 0 end) 语文,
      max(case subject when '数学' then grade else 0 end) 数学,
      max(case subject when '英语' then grade else 0 end) 英语
    from grades 
    group by name