有一个表data。结构是: 三个年级里的所有的班级的学生给他的每科的任课老师打分的,每个学生一条记录  
年级 班级 语文 数学 英语 科学    体育  电脑 
1    01   12   13   30   26             30   32  
1    01   12   13   30   26

1    02   23   13   30   32             30   32
1    02   12   15   30   23             30   32
2    01   12   15   30   23             24   35 
3    05   25   45   24   35             64   17
3    08   24   54   64   17             45   24 
下面这句是我以前写的每个科目只去掉最高和最低的一个分数
set rs1=rsuser("SELECT nianji,banji,(sum(语文)-max(语文)-min(语文))/(count(*)-2) ,(sum(数学)-max(数学)-min(数学))/(count(*)-2),(sum(英语)-max(英语)-min(英语))/(count(*)-2),(sum(科学)-max(科学)-min(科学))/(count(*)-2) from data group by 年级,班级")
现在的要求是把每个班级每个科目的学生打老师分数的前10%和后10%去掉,再算余下的各个科目的老师的平均得分(每个科目去掉最高和最低的一批记录后不会是同样的记录)所以我用了下面的语句,set rs2=rsuser("select avg(kemu) from (select * from data where id not in(select top 10 percent id from data where nianji & banji='101' order BY " & kemu & ",id) and id not in(select top 10 percent id from data where nianji & banji='" & bj & "' order BY " & kemu & " desc,id)) where nianji & banji='" & bj & "'")
kemu有14个是个变量要循环起来,每个科目都要执行上面的查询一次,总的班级有40来个,所以类似上面的查询要执行40*14次,页面就显示超时了, 高手们能否给我效率更高速度更快的查询吗,请写出具体的代码或者思路,表的结构是变不了了。 先谢谢了

解决方案 »

  1.   

    建议直接使用你的程序来计算,而不是用SQL语句来实现。 你可以在VB语句中打开全表,然后逐一记录处理计算。你可以一次把一个班的数据全部读入数组,然后进行10%的统计处理。
      

  2.   

    select avg(kemu) from tb
     where id not in(select top 10 percent id from tb where banji=a.banji and  
                              nianji=a.nianji order by kemu)
     and id not in(select top 10 percent id from tb where banji=a.banji and  
                              nianji=a.nianji order by kemu desc)