主题:请问,怎么挑出每个班级总分前50名的纪录呢?
coffeenight
[专家分:230] 发布于 2008-08-28 20:50:00
现有一自由表,结构如下
班级,学号,姓名,总分
请问怎么挑出每个班级总分前50名的学生呢?
评分感谢回复!
最后更新于:2008-09-02 21:55:00
回复列表 (共20个回复)
11 楼
coffeenight [专家分:230] 发布于 2008-09-01 23:13:00
谢谢farwish
12 楼
coffeenight [专家分:230] 发布于 2008-09-01 23:36:00
[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 楼
LuckyLine [专家分:1940] 发布于 2008-09-02 10:30:00
SQL : TOP requires an ORDER BY
SELECT TOP 50 * FROM ...... OREDR BY 1.....
14 楼
farwish [专家分:270] 发布于 2008-09-02 10:43:00
[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 楼
farwish [专家分:270] 发布于 2008-09-02 11:17:00
其实编程使用什么函数和命令都是次要的,最重要的是你的逻辑思维,在这个过程中你要知道要做什么,得到什么结果,中间的过程是如何实现,至于中间的实现方法有的一个语句实现,不知道的可能要转换实现,但是都达到了一个结果.
语法和命令是可以通过看书和帮助来学习,但是思维能力不是看书能学到的,而是要通过不段的练习和分析,实践才能提高!
就拿这个来说(步骤):
1 模拟数据原型(最复杂化的那种)
2 找出班级数(避免重复)
3 找出每个班级的前总分50人
4 把这些数据存放在一起.
5 完成(关闭原表以及释放临时表和删除过渡的TABLE)
16 楼
cbl518 [专家分:57140] 发布于 2008-09-02 16:41:00
谢谢 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 楼
cbl518 [专家分:57140] 发布于 2008-09-02 16:46:00
你把数据表上传 或 发到我的邮箱!
你也可以将 QQ 号,发到我的短信中!
18 楼
coffeenight [专家分:230] 发布于 2008-09-02 22:43:00
首先感谢各位朋友的热心帮助!
说到思路,我刚接触到这个问题的时候就想
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 楼
coffeenight [专家分:230] 发布于 2008-09-02 23:56:00
由于 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 楼
ylp201 [专家分:0] 发布于 2008-09-03 23:15:00
呵呵,非常感谢这多老师在耐心的讲解,虽然是旁观,但是也学到了不少东西。因为工作的原因,现在又要用丢失了多年的foxpro了,水平已经相当于一个新手。今晚学到了alen()这个函数,非常的不错。
我来回复