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

有关top percent的困惑,请高手答疑
注意是:sqlserver 2000 sp4啊
小弟想计算一下某个班级总分排名前60%的人的数学科目的平均分
用了以下两种语句,感觉逻辑上都是正确的,但是结果却不相同

1、
SQL code

select avg(理科数学) from z_21 where examcode in (select top 60 percent examcode from z_21 where class='61' order by '总分' desc) and class='61'


得到结果:48.457142857142856
2、
SQL code

select top 60 percent avg(理科数学) from z_21 where class='61' order by '总分' desc


得到结果:44.893827160493828

居然相差了4分。然后研究了一下发现第2中方法中不管怎么写得到的结果都一样:
SQL code

select top 10 percent avg(理科数学) from z_21 where class='61' order by '总分' desc
select top 30 percent avg(理科数学) from z_21 where class='61' order by '总分' desc
select top 60 percent avg(理科数学) from z_21 where class='61' order by '总分' desc


(我表里的总记录数是81条是大于60的)。
得到的结果都是:44.893827160493828
难道在这种情况下 top percent失效了?难不成是SQLSERVER 2K的一个BUG?

求高手解答。分有点少,就这么多了,明天再加。

------解决方案--------------------
楼主可以看看
逻辑查询处理中的各个阶段
------解决方案--------------------
TOP基本上是最后一个处理阶段
------解决方案--------------------
SQL code
帮水锅解释下:

逻辑查询处理的各个阶段
(5) SELECT (5-2) DISTINCT (5-3) TOP(top_specification)(5-1)(select_list) 
(1) FROM(1-J)<left_table><join_type> join<right _table> on <on_predicate>
(1-A) < left_table><apply_type> apply<right_table_expression> AS<alias>
(1-P) < left_table>PIVOT(<piovt_specification>) AS <alias>
(1-U) < left_table>UNPIVOT(<unpiovt_specification>) AS <alias>
(2) WHERE <where_predicate>
(3)GROUP BY<group_by_specification>
(4)HAVING(having_predicate>
(6)ORDER BY<order_by_list>;