回 帖 发 新 帖 刷新版面

主题:请问,怎么挑出每个班级总分前50名的纪录呢?

现有一自由表,结构如下
班级,学号,姓名,总分

请问怎么挑出每个班级总分前50名的学生呢?

评分感谢回复!

回复列表 (共20个回复)

11 楼

谢谢farwish

12 楼

[quote]SELECT 班级 FROM 自由表 GROUP BY 1 INTO ARRAY aG班级
SELECT TOP 50 * FROM 自由表 WHERE 班级=aG班级[1,1] INTO TABLE 班级50
FOR i=2 TO ALEN(aG班级,1)
    INSERT INTO 班级50 SELECT TOP 50 * FROM 自由表 WHERE 班级=aG班级[i,1]
ENDFOR
[/quote]

谢谢CB518
有几点不明白: grou by 1是什么意思呢
    SELECT TOP 50 * FROM 自由表 WHERE 班级=aG班级[1,1] INTO TABLE 班级50 这句提示语法错误
   
   嗯,循环应该是用在VFP9.0上,  我的6.0也提示语法错误,汗~~~
一直不习惯 vfp9.0 的 group by 所以就没再装它了

13 楼


SQL : TOP requires an ORDER BY

SELECT TOP 50 * FROM ...... OREDR BY 1.....

14 楼

[quote][quote]SELECT 班级 FROM 自由表 GROUP BY 1 INTO ARRAY aG班级
SELECT TOP 50 * FROM 自由表 WHERE 班级=aG班级[1,1] INTO TABLE 班级50
FOR i=2 TO ALEN(aG班级,1)
    INSERT INTO 班级50 SELECT TOP 50 * FROM 自由表 WHERE 班级=aG班级[i,1]
ENDFOR
[/quote]

谢谢CB518
有几点不明白: grou by 1是什么意思呢
    SELECT TOP 50 * FROM 自由表 WHERE 班级=aG班级[1,1] INTO TABLE 班级50 这句提示语法错误
   
   嗯,循环应该是用在VFP9.0上,  我的6.0也提示语法错误,汗~~~
一直不习惯 vfp9.0 的 group by 所以就没再装它了[/quote]

group by 1 是指用表的第1列字段分组=group by 班级,就是将第一列分组类别项(班级)存放到数组,ALEN(数组,1)返回数组的行数,也就是班级个数

15 楼


其实编程使用什么函数和命令都是次要的,最重要的是你的逻辑思维,在这个过程中你要知道要做什么,得到什么结果,中间的过程是如何实现,至于中间的实现方法有的一个语句实现,不知道的可能要转换实现,但是都达到了一个结果.

语法和命令是可以通过看书和帮助来学习,但是思维能力不是看书能学到的,而是要通过不段的练习和分析,实践才能提高!

就拿这个来说(步骤):
1 模拟数据原型(最复杂化的那种)
2 找出班级数(避免重复)
3 找出每个班级的前总分50人
4 把这些数据存放在一起.
5 完成(关闭原表以及释放临时表和删除过渡的TABLE)

16 楼

谢谢 LuckyLine 老师的提醒:

SELECT 班级 FROM 自由表 GROUP BY 1 INTO ARRAY aG班级
SELECT TOP 50 * FROM 自由表 WHERE 班级=aG班级[1,1]  ORDER BY 班级 INTO TABLE 班级50
FOR i=2 TO ALEN(aG班级,1)
    INSERT INTO 班级50 SELECT TOP 50 * FROM 自由表 WHERE 班级=aG班级[i,1] ORDER BY 班级 
ENDFOR

17 楼

你把数据表上传 或 发到我的邮箱!

你也可以将 QQ 号,发到我的短信中!

18 楼

首先感谢各位朋友的热心帮助!
说到思路,我刚接触到这个问题的时候就想
1,sele * from cj order by bj,zf
2, sele top50 * from cj where bj=1 order by zf into curs bj1
   sele top50 * from cj where bj=2 order by zf into curs bj2
   .....
   .....
   sele top50 * from cj where bj=5 order by zf into curs bj5
3, sele * from bj1 union sele * from bj2 union.........sele * from bj5 into table 结果表

但是后来遇到需要处理10个班级的,意识到我必须寻找一个更好的方法,或者寻求一种更好的思路。
CB518老师的方法显然可用性更广,语句也更简洁,学习了。
最后,感谢farwish老师的答疑。谢谢!

19 楼

由于  6.0 无法使用 
INSERT INTO... SELECT ....语句
所以我将CB518老师的方法做了点小改动,使之可以在6.0下运行,如下

SELECT bj from 成绩 grou by 1 into array bjsm
SELECT top 50 * from 成绩 where bj=bjsm[1,1] order by zf desc into table 成绩表
FOR i=2 to ALEN(bjsm,1) 
SELECT top 50 * from 成绩 where bj=bjsm[i,1] order by zf desc into array temp
SELECT 成绩表
APPEND FROM array temp
ENDFOR

20 楼

呵呵,非常感谢这多老师在耐心的讲解,虽然是旁观,但是也学到了不少东西。因为工作的原因,现在又要用丢失了多年的foxpro了,水平已经相当于一个新手。今晚学到了alen()这个函数,非常的不错。

我来回复

您尚未登录,请登录后再回复。点此登录或注册