日期:2014-05-18  浏览次数:20548 次

关于一个子查询的问题
我的原表格 grades 是这样的
name subject grade
张三 语文 72
张三 数学 100
张三 英语 75
李四…………………
……………………

SQL code

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前面几条记录 用的办法是
SQL code

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

相当于 又变回来了。

跪求高手指点!

------解决方案--------------------
SQL code
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