读书人

有关top percent的困惑请高手答疑解

发布时间: 2012-03-14 12:01:13 作者: rapoo

有关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 '总分' descselect top 30 percent avg(理科数学) from z_21 where class='61' order by '总分' descselect 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>; 

读书人网 >SQL Server

热点推荐