请教各位老师,如何求出各种名次
老师,学号22--01--01,即年级--班级--学号,如何根据这个成绩表求出----学号 姓名 语文 语文班内名次 语文总名次 .....总分 总分钟名次 总分班内名次,谢谢
cj.rar
(738 Bytes)
[此贴子已经被作者于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 && 排名结果