Office中国论坛/Access中国论坛

标题: 请教:同一查询下的多重排序问题 [打印本页]

作者: 影子5555    时间: 2015-3-23 09:42
标题: 请教:同一查询下的多重排序问题
现在的学生难,每天的学习压力很大,还要面临各种各样的考试。问题出现了,每每考试都要排名,单科排名,总分排名,班级排名,等等等等。我作为一名access路上的新手小小白,再一次遇到问题请大师出手相助,帮我解决目前挡住我前进的这只拦路虎。
作为新手我当然也不是遇见问题就求救,我在网上搜了很久,目前只能解决在一个查询中解决排名的问题,用这个方法解决某一个的单科排名或者总分排名都没有问题,稍作修改也可以算出班级排名,但是不能将几列内容分别排序。

当然,我也想过,麻烦点,把所有单科的排名查询都算出来,然后再根据这些查询汇总一个查询,只是这种排名的办法很慢,合到一起就更慢,甚至停止响应,崩溃重启。而且,我上传的例子只是其中的三门课,具体课程非常多,而且门课程的算法也非常多,所以最好的解决办法是能有一个办法能在一个查询中算出多列的排序。
如果有这样一段代码,或者这样的模块,各位前辈老师快告诉我吧。


作者: 影子5555    时间: 2015-3-23 09:43
{:soso_e183:}{:soso_e183:}{:soso_e183:}
作者: todaynew    时间: 2015-3-23 10:52
本帖最后由 todaynew 于 2015-3-23 14:28 编辑

数据表结构错误,按以下示例处理:

[attach]55975[/attach]

[attach]55976[/attach]

作者: roych    时间: 2015-3-23 11:49
本帖最后由 roych 于 2015-3-23 11:54 编辑

你就不能把每个科目成绩表放在一起吗?
[attach]55974[/attach]注:如果科目比较多的话,可以考虑下面的设计:
学生 科目 成绩

作者: 影子5555    时间: 2015-3-23 21:09
谢谢todaynew师父和roych老师的帮助,非常感谢,问题已经解决!
因为我设计的系统中设计太多的排序,所以roych老师的办法更好,掌握了这个函数,真可以说是事半功倍,等我大功告成之日我将发我的作品到论坛,到时候请两位老师和广大access爱好者批评指正。{:soso_e182:}
作者: 影子5555    时间: 2015-3-23 23:55
roych 发表于 2015-3-23 11:49
你就不能把每个科目成绩表放在一起吗?
注:如果科目比较多的话,可以考虑下面的设计:
学生 科目 成绩

roych老师,你写的rank函数真的很好用,但是我在使用的过程中发现这个只能针对于某一个表或查询,不能在所有的地方使用,这样我变更查询源 的时候就需要在复制一个你的函数,重新改个函数名字,更改模块中表的名字。这样虽然解决了问题,但是总感觉美中不足。不知可否让这个函数变成我在所有的查询中都能用呢?
作者: roych    时间: 2015-3-24 09:09
本帖最后由 roych 于 2015-3-24 11:33 编辑
影子5555 发表于 2015-3-23 23:55
roych老师,你写的rank函数真的很好用,但是我在使用的过程中发现这个只能针对于某一个表或查询,不能在 ...

可以的。需要把表名称设置为变量就可以了,稍后再改下[attach]55985[/attach]

作者: 影子5555    时间: 2015-3-24 15:16
roych 发表于 2015-3-24 09:09
可以的。需要把表名称设置为变量就可以了,稍后再改下

问题圆满解决,谢谢!roych老师,你不但帮我写好了代码,还做了详细的批注,谢谢
作者: 影子5555    时间: 2015-3-25 20:48
roych 发表于 2015-3-24 09:09
可以的。需要把表名称设置为变量就可以了,稍后再改下

roych老师,我又有新问题了!
所谓圣意难测,伴君如伴虎。本来想收到领导表扬的,结果有好多数据和传统算法的结果对不上,所以又被领导批评了。
问题出在班序上,在对教师测评中有对班级学生前10名均分、前30名等均分的排名考核,我用的方法是分别计算前10、前30名的均分,但是由于排名公式是11345...的方法,所以前10名不一定是10个人的成绩,这样的话当人数超过10人的时候求的平均值就会比传统算法的低(传统算法是只算10个人,不考虑并列)。
所以我能想到的解决方向有两个:
第一:求平均值的时候算最高的10个值,而不是前10名的。
第二:更改班级排序的算法,让班序按12345...的方法排序。
遗憾,这两个方法我都不会,想了好久也不会
所以请roych老师再度出手相助,或者介绍更好的方法!
作者: 影子5555    时间: 2015-3-26 09:56
roych 发表于 2015-3-24 09:09
可以的。需要把表名称设置为变量就可以了,稍后再改下

搜了半天,也不知道是关键字不对还是怎么了,总是找不到解决办法,
找了一个SELECT DISTINCT TOP 10 *,但是这个返回的结果也不对,
作者: roych    时间: 2015-3-26 10:41
影子5555 发表于 2015-3-25 20:48
roych老师,我又有新问题了!
所谓圣意难测,伴君如伴虎。本来想收到领导表扬的,结果有好多数据和传统 ...


普通的查询是没办法解决的。大概只能用ADO MoveNext下去。——先别烦我,待会儿有时间了再写。
作者: 影子5555    时间: 2015-3-26 11:19
roych 发表于 2015-3-26 10:41
普通的查询是没办法解决的。大概只能用ADO MoveNext下去。——先别烦我,待会儿有时间了再写。

呵呵,我又有了新想法,在班级排名中加一个条件,当成绩相同时学号大的优先。这样就不会出现同名次了。
http://blog.csdn.net/acmain_chm/article/details/5125291
不知道这个办法能不能用在你的rank模块中。
roych老师,你先忙,我不着急的。。。我再四处溜达溜达




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3