请教各位老师,如何求出各种名次
老师,学号22--01--01,即年级--班级--学号,如何根据这个成绩表求出----学号 姓名 语文 语文班内名次 语文总名次 .....总分 总分钟名次 总分班内名次,谢谢
[此贴子已经被作者于2023-12-15 02:38编辑过]
程序代码: * cj_计算名次
SET SAFETY off
SET engi 70
CLOSE DATABASES
SELECT 0
USE cj
SELECT * from cj orde by 总分 desc into cursor temp readw
SELECT temp
REPLACE zfmc with RECNO() all
SELECT temp
GO top
SCAN
SELECT cj
LOCATE for cj.学号=temp.学号
IF FOUND()
REPLACE cj.zfmc with temp.zfmc
ENDIF
SELECT temp
ENDSCAN
*--
SELECT bj from cj grou by bj into cursor bjk
SELECT bjk
SCAN
c_bj=bjk.bj
SELECT * from cj where bj=c_bj orde by 总分 desc into curs ls readw
SELECT ls
REPLACE zfbm with RECNO() all
GO top
SCAN
SELECT cj
LOCATE for cj.学号=ls.学号
IF FOUND()
REPLACE cj.zfbm with ls.zfbm
ENDIF
SELECT ls
ENDSCAN
SELECT ls
USE
SELECT bjk
ENDSCAN
*--总分的年级名次和班级名次计算完成,学科的计算依次类推(举一反三)
*--代码比较长,但是是最基本的算法。
程序代码:SET SAFETY OFF
SELECT *,SPACE(2) 年级,SPACE(2) 班级,0000 总名次,0000 班名次,0000 语文总,0000 语文班 FROM cj INTO CURSOR temp READW
REPLACE 年级 WITH SUBSTR(学号,1,2) ,班级 WITH SUBSTR(学号,3,2) ALL
**分数相同,名次并列
*总分名次
INDEX ON 总分 TAG zfzf DESC
mc=1 &&记录名次
nzf=0 &&记录上条记录总分
nrs=1 &&记录总人数
SCAN
IF 总分!=nzf
nzf=总分
mc=nrs
ENDIF
REPLACE 总名次 WITH mc
nrs=nrs+1
ENDSCAN
* 总分班级名次
INDEX ON 班级-STR(1000-总分) TAG px && 我这样实现了班级升序,总分降序排列
mc=1 && 记录班级名次
nzf=0 && 记录上条记录的总分
cbj="" && 记录班级名称
nrs=1 && 记录班级人数
SCAN
IF ALLTRIM(班级)!=cbj
STORE 1 TO nrs,mc
ELSE
IF 总分!=nzf
mc=nrs
ENDIF
ENDIF
REPLACE 班名次 WITH mc
nrs=nrs+1
nzf=总分
cbj=ALLTRIM(班级)
ENDSCAN
* 语文总名次
INDEX ON 年级-STR(1000-语文) TAG px && 我这样实现了班级升序,总分降序排列
mc=1 && 记录班级名次
nzf=0 && 记录上条记录的总分
cbj="" && 记录班级名称
nrs=1 && 记录班级人数
SCAN
IF ALLTRIM(年级)!=cbj
STORE 1 TO nrs,mc
ELSE
IF 语文!=nzf
mc=nrs
ENDIF
ENDIF
REPLACE 语文总 WITH mc
nrs=nrs+1
nzf=语文
cbj=ALLTRIM(年级)
ENDSCAN
* 语文班名次
INDEX ON 班级-STR(1000-语文) TAG px && 我这样实现了班级升序,总分降序排列
mc=1 && 记录班级名次
nzf=0 && 记录上条记录的总分
cbj="" && 记录班级名称
nrs=1 && 记录班级人数
SCAN
IF ALLTRIM(班级)!=cbj
STORE 1 TO nrs,mc
ELSE
IF 语文!=nzf
mc=nrs
ENDIF
ENDIF
REPLACE 语文班 WITH mc
nrs=nrs+1
nzf=语文
cbj=ALLTRIM(班级)
ENDSCAN
BROWSE
[此贴子已经被作者于2023-12-19 09:29编辑过]
程序代码:
CLOSE DATABASES
LOCAL xfile,xkc[1],xmc,ii,xfield,xfilemc,xtmpfile,xcj,xbj
xfile = '语文,数学,英语,物理,化学,生物,历史,政治,地理,总分'
ALINES(xkc,xfile,2,',')
xfield = '学号,姓名'
FOR ii=1 TO ALEN(xkc)
xfield = xfield + ',CAST(0 AS int) ' + xkc[ii] + '班内名次,CAST(0 AS int) ' + xkc[ii] + '总名次'
ENDFOR
xfilemc = SYS(2015)
SELECT *,LEFT(学号,4) bj FROM cj INTO CURSOR &xfilemc
xfile = SYS(2015) && 排名结果表
SELECT &xfield FROM &xfilemc INTO CURSOR &xfile READWRITE
FOR ii=1 TO ALEN(xkc)
xfield = xkc[ii]
xtmpfile = SYS(2015)
* 班级名次
SELECT 学号,bj,&xfield FROM &xfilemc ORDER BY bj,&xfield DESC INTO CURSOR &xtmpfile
xbj = '999999'
xmc = 0
xcj = 99999
SELECT &xtmpfile
SCAN
IF bj==xbj && 同班
ELSE
xbj = bj
xmc = 0
xcj = 99999
ENDIF
IF &xfield==xcj && 成绩相同,名次相同
ELSE
xcj = &xfield
xmc = xmc + 1
ENDIF
SELECT &xfile
REPLACE &xfield.班内名次 WITH xmc FOR 学号=&xtmpfile..学号
ENDSCAN
xmc = 0
xcj = 99999
SELECT * FROM &xtmpfile ORDER BY &xfield DESC INTO CURSOR &xtmpfile
SCAN
IF &xfield==xcj && 成绩相同,名次相同
ELSE
xcj = &xfield
xmc = xmc + 1
ENDIF
SELECT &xfile
REPLACE &xfield.总名次 WITH xmc FOR 学号=&xtmpfile..学号
ENDSCAN
USE IN &xtmpfile
ENDFOR
USE IN &xfilemc
SELECT * FROM &xfile && 排名结果