回复 9楼 schtg
我只是一个算法,具体数据按实际情况去组织,按班算就算 班的记录数*20%回复 10楼 my2318
3楼提到的问题,如果20%中最后一个与跟随其后面的一个成绩相同就有问题。
程序代码:
* 增加一个bjmc字段,记录班级排名
SELECT *,00000 AS bjmc FROM stu INTO CURSOR temp1 READWRITE
UPDATE temp1 SET bjmc=(SELECT COUNT(*)+1 FROM temp1 AS B WHERE B.成绩>temp1.成绩 AND B.班级=temp1.班级)
* 生成班级人数总人数和前百分20 人数统计表。
SELECT 班级, COUNT(*) AS zrs, ;
CEILING(COUNT(*) * 0.2) AS ncount20 ;
FROM stu ;
WHERE NOT EMPTY(班级) ;
GROUP BY 班级 ;
INTO CURSOR tempbj
BROWSE &&& 测试查看用
* 创建空临时表结构
SELECT * FROM temp1 ;
WHERE .F. ;
INTO CURSOR TEMP2 READWRITE
* 循环处理每个班级,直接使用tempbj表统计的数值
SELECT tempbj
SCAN
* 从tempbj中直接获取总人数和前百分之20人数。
nCount = tempbj.zrs
nCount20 = tempbj.ncount20
* 取前百分之20的学生
SELECT * FROM temp1 ;
WHERE (temp1.班级) = (tempbj.班级) ;
AND NOT EMPTY(班级) ;
AND bjmc <= nCount20 ; && 排名小于等于前20%的人数
ORDER BY 成绩 DESC ;
INTO ARRAY bjzf
* 追加到临时表
SELECT TEMP2
APPEND FROM ARRAY bjzf
ENDSCAN
* 显示结果
SELECT TEMP2
GO TOP
BROWSE &&& 测试查看用
[此贴子已经被作者于2025-12-15 14:16编辑过]
程序代码:
**2025年12月15日,整理测试
**来自:编程论坛 - 各位大侠,使用SQL语句能否一次性取得各班成绩前20%的学生的信息
**https://bbs.bc-/viewthread.php?tid=514644&page=2&extra=page%3D1#pid2795494
t1=Seconds()&&计时函数
** 增加一个bjmc字段,记录班级排名
SELECT *,00000 AS bjmc FROM zcj INTO CURSOR temp1 READWRITE
UPDATE temp1 SET bjmc=(SELECT COUNT(*)+1 FROM temp1 AS B WHERE B.zcj>temp1.zcj AND B.bj=temp1.bj)
** 生成bj人数总人数和前百分20人数统计表。
SELECT bj, COUNT(*) AS zrs, ;
CEILING(COUNT(*) * 0.2) AS nCount20 ;
FROM zcj ;
WHERE NOT EMPTY(bj) ;
GROUP BY bj ;
INTO CURSOR tempbj
*BROWSE TITLE "bj总人数和前百分之20人数" &&& 测试查看用
* 创建空临时表结构
SELECT * FROM temp1 ;
WHERE .F. ;
INTO CURSOR TEMP2 READWRITE
* 循环处理每个bj,直接使用tempbj表统计的数值
SELECT tempbj
SCAN
* 从tempbj中直接获取总人数和前百分之20人数。
nCount = tempbj.zrs
nCount20 = tempbj.nCount20
* 取前百分之20的学生
SELECT * FROM temp1 ;
WHERE (temp1.bj) = (tempbj.bj) ;
AND NOT EMPTY(bj) ;
AND bjmc <= nCount20 ; && 排名小于等于前20%的人数
ORDER BY zcj DESC ;
INTO ARRAY bjzf
* 追加到临时表
SELECT TEMP2
APPEND FROM ARRAY bjzf
ENDSCAN
Messagebox("完成!共运行:"+Transform(Seconds()-t1)+"秒",64, "计时信息") &&计算用时多少
* 显示结果
SELECT TEMP2
GO TOP
BROWSE &&& 测试查看用