| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6228 人关注过本帖, 2 人收藏
标题:vfp用sql如何取出每个班中的前3名
只看楼主 加入收藏
djszyyc
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2013-3-17
收藏
得分:0 
回复 31楼 taifu945
对头,我在学校工作,要算教师教学成绩考核分,这学期出来的新规定:每个班的人数不一样,有的56人,有的57人,有的54人,有的52人,本校的考核制度要求以最少的班级的人数为基准(这里为52人),每个班的总成绩按从高到低排序,然后取出每个班的前52人,如果最后一名并列,则不取并列的,如果中间有并列的,则要取,总而言之,每个班只取52个人出来.现在想的就是用一条SQL语言来实现.
2013-03-18 22:07
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
取出每个班的前52人,如果最后一名并列,则不取并列的
也就是说有的班人数超出52 即使第53与52并列也只取到52对吧
前面讨论的已可解决你问题了
2013-03-18 22:17
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用djszyyc在2013-3-18 22:07:00的发言:

对头,我在学校工作,要算教师教学成绩考核分,这学期出来的新规定:每个班的人数不一样,有的56人,有的57人,有的54人,有的52人,本校的考核制度要求以最少的班级的人数为基准(这里为52人),每个班的总成绩按从高到低排序,然后取出每个班的前52人,如果最后一名并列,则不取并列的,如果中间有并列的,则要取,总而言之,每个班只取52个人出来.现在想的就是用一条SQL语言来实现.

如果这样,我觉得还是用编程的方法简单(我是指代码的可读性和可维护性更好)。思路是:用SELECT-SQL命令截出所有班别号,然后弄一个循环,分别找出前52人,然后拼凑到一个表文件中。这要比苦苦思索一条SQL命令好得多,也轻松得多。


[ 本帖最后由 taifu945 于 2013-3-19 08:32 编辑 ]
2013-03-19 08:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 43楼 taifu945
说得好

授人以渔,不授人以鱼。
2013-03-19 10:51
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:3 
就是有人追求用一条SQL命令来解决问题,甚至于多用一行命令都不行。盲目追求这样的效果未必是明智的。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2013-03-19 13:40
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:989
专家分:4966
注 册:2013-2-16
收藏
得分:0 
关于取前三个人,还是取前三个成绩的问题,谈一点我本人的浅见。
我们单位也是要年终考评的,各个同事最终得到的考评分,前三名有100%年终奖,后三名为年终奖*80%
由于这人涉及到员工的切身利益,如果有同事间考评分相同,则按成绩取分,比如考评分=95的员工有2个,考评分=92的员工有3个,考评分=90的员工有4个,考评分=89的员工有6个,这种情况下,我们单位取“前三名”,会只考虑成绩,也就是 我们在这种情况下,“前三名”会取出9人(95分2人,92分3人,90分4人)。 如果只取前三个人,那么考评分=92的同事会有2个取不到,这显然对他们是不公平的。

这是第一种情况,分数相同的,按分数取,取“前三名”而不是前三人。
另一种情况,是在我们计算各分店销售额时取的,各分店月底的销售数据按销售类别分,只取前三种销量最高的产品来统计,
例如,A产品销量第一,B、C、D产品销量并列第二,E产品销量第三,
这时我们取“前三”,只考虑取前三条记录,即使销量相同,也只取三条记录,以本例来说,会取出A、B、C(或者会取ACD,或ABD),BCD中,总会有一条取不到了,不过没关系,因为这个时候取前三,只具有数学统计含义,取C与取D来统计数据,最终报表的结果并没有什么不同,所以,这个时候,就不必纠结分数相同的问题了。

总之,取“前三名”,还是取“前三条”记录的问题,要根据实际情况来定,灵活掌握,完全不必在这个问题上纠结。

[ 本帖最后由 厨师王德榜 于 2013-4-4 15:30 编辑 ]
2013-04-04 15:25
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
回复 46楼 厨师王德榜
有道理的
2013-04-04 17:30
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用厨师王德榜在2013-4-4 15:25:15的发言:

关于取前三个人,还是取前三个成绩的问题,谈一点我本人的浅见。
我们单位也是要年终考评的,各个同事最终得到的考评分,前三名有100%年终奖,后三名为年终奖*80%
由于这人涉及到员工的切身利益,如果有同事间考评分相同,则按成绩取分,比如考评分=95的员工有2个,考评分=92的员工有3个,考评分=90的员工有4个,考评分=89的员工有6个,这种情况下,我们单位取“前三名”,会只考虑成绩,也就是 我们在这种情况下,“前三名”会取出9人(95分2人,92分3人,90分4人)。 如果只取前三个人,那么考评分=92的同事会有2个取不到,这显然对他们是不公平的。

这是第一种情况,分数相同的,按分数取,取“前三名”而不是前三人。
另一种情况,是在我们计算各分店销售额时取的,各分店月底的销售数据按销售类别分,只取前三种销量最高的产品来统计,
例如,A产品销量第一,B、C、D产品销量并列第二,E产品销量第三,
这时我们取“前三”,只考虑取前三条记录,即使销量相同,也只取三条记录,以本例来说,会取出A、B、C(或者会取ACD,或ABD),BCD中,总会有一条取不到了,不过没关系,因为这个时候取前三,只具有数学统计含义,取C与取D来统计数据,最终报表的结果并没有什么不同,所以,这个时候,就不必纠结分数相同的问题了。

总之,取“前三名”,还是取“前三条”记录的问题,要根据实际情况来定,灵活掌握,完全不必在这个问题上纠结。

是的,关键是看统计的结果作何用处,这是操作前的一个指导方针问题。在这个指导方针下,才是后面的操作过程,但也比较重要,一旦把参照内容搞错,得出的结果将会背离指导方针。
2013-04-04 22:13
chychychy
Rank: 2
等 级:论坛游民
帖 子:285
专家分:98
注 册:2015-4-18
收藏
得分:0 
*讨论前3名和前3人,是不完全相同的,名次排列方式也有两种其一为同分占名次(12245668……),其二为同分不占名次(122345667……)
程序代码:
CLEAR 
Select cj
Blank Fields njmc,bjmc All  &&&测试用
*Browse &&&测试用
**1.相同分数占名次(12245668……)并列第2两个,无第3,接第4
*年级名次,
UPDATE cj SET njmc=(SELECT COUNT(*)+1 FROM cj A WHERE cj.zf<A.zf) &&&子查询叫A或者B都可以,大于小于写颠倒顺序也可以,上下效果一样
SELECT * ORDER BY zf DESC FROM cj&&&测试用

*班级名次,在where语句中多加一个班级的条件即可
UPDATE cj SET bjmc=(sele coun(*)+1 from cj as B WHERE B.zf>cj.zf AND B.bj=cj.bj)
SELECT * ORDER BY BJ,zf DESC FROM cj&&&测试用

*取班级名次前3名
SELECT * FROM cj ORDER BY bj,zf DESC WHERE bjmc<=3 INTO CURSOR 班级前3名
BROWSE 
6 天前 08:56
chychychy
Rank: 2
等 级:论坛游民
帖 子:285
专家分:98
注 册:2015-4-18
收藏
得分:0 
程序代码:
CLEAR 
Select cj
Blank Fields njmc,bjmc All  &&&测试用
**2.相同分数不占名次(122345667……)并列第2,接着第3、第4
**年级名次,字段njmc
Select zf,Recno() mc From (Select Distinct zf From cj Order By zf Desc) A Into Cursor T1 &&合并为1句,此处A不可少,否则错误,也可以直接写为T1
Update cj Set cj.njmc=t1.mc From t1 Where cj.zf=t1.zf
SELECT * ORDER BY zf DESC FROM cj&&&测试用
**班级名次
SELECT cj
SELECT DISTINCT  bj FROM cj INTO ARRAY abj
?ALEN(abj)&&&测试用
FOR i=1 TO ALEN(abj)
    *?abj[i]&&&测试用
    SELECT DISTINCT zf,0000 pm FROM cj ORDER BY zf DESC WHERE ALLTRIM(cj.bj)=abj[i] INTO CURSOR tbj1 READWRITE
    UPDATE tbj1 SET pm=RECNO()
    *SELECT tbj1&&&测试用
    *BROWSE&&&测试用
    UPDATE cj SET cj.bjmc=tbj1.pm FROM tbj1 WHERE cj.zf=tbj1.zf AND ALLTRIM(cj.bj)=abj[i]
ENDFOR
SELECT * ORDER BY BJ,zf DESC FROM cj&&&测试用

*取班级名次前3名
SELECT * FROM cj ORDER BY bj,zf DESC WHERE bjmc<=3 INTO CURSOR 班级前3名1
BROWSE 

6 天前 08:58
快速回复:vfp用sql如何取出每个班中的前3名
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032971 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved