| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1082 人关注过本帖
标题:请教各位老师,如何求出各种名次
只看楼主 加入收藏
jinanshui
Rank: 2
等 级:论坛游民
帖 子:295
专家分:67
注 册:2009-10-6
结帖率:93.88%
收藏
已结贴  问题点数:20 回复次数:22 
请教各位老师,如何求出各种名次
老师,学号22--01--01,即年级--班级--学号,如何根据这个成绩表求出----学号  姓名  语文  语文班内名次  语文总名次  .....总分  总分钟名次  总分班内名次,谢谢
cj.rar (738 Bytes)


[此贴子已经被作者于2023-12-15 02:38编辑过]

搜索更多相关主题的帖子: 学号 老师 成绩表 总分 语文 
2023-12-15 02:34
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1790
专家分:3389
注 册:2012-2-29
收藏
得分:0 
回复 楼主 jinanshui
增加字段:alter table 表名 add 字段名 类型(宽度[,小数位] )
年级排名:update 表名 SET 名次字段 = (select count(a.字段名) + 1 from 表名 as a where a.排名字段>zcj.排名字段)
班级排名:update 表名 SET 名次字段 = (select count(a.字段名) + 1 from 表名 as a where a.排名字段>zcj.排名字段 and a.班级字段=zcj.班级字段)
按排名字段循环一下即可。
2023-12-15 06:20
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2232
专家分:3913
注 册:2007-4-27
收藏
得分:6 
程序代码:
    * 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 
    *--总分的年级名次和班级名次计算完成,学科的计算依次类推(举一反三)
    
    *--代码比较长,但是是最基本的算法。


cj.rar (1.4 KB)

只求每天有一丁点儿的进步就可以了
2023-12-15 15:57
jinanshui
Rank: 2
等 级:论坛游民
帖 子:295
专家分:67
注 册:2009-10-6
收藏
得分:0 
谢谢各位老师,我试试。
2023-12-15 22:19
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:105
注 册:2015-4-18
收藏
得分:6 
以总分、和语文为例排列,我只会这样笨一点,如何让语文、数学……自动循环没掌握
程序代码:
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编辑过]

2023-12-19 09:21
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:105
注 册:2015-4-18
收藏
得分:0 
回复 3楼 wengjl
这样总分相同名次不同,一般总分相同名次相同
2023-12-19 09:30
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
收藏
得分:6 
程序代码:
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    && 排名结果
2023-12-19 11:45
bdx808
Rank: 1
等 级:新手上路
帖 子:85
专家分:2
注 册:2009-5-9
收藏
得分:0 
版主这个哪里疏忽了吧,看不懂,提示找不到列'BJ'
2023-12-20 09:59
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:105
注 册:2015-4-18
收藏
得分:2 
回复 8楼 bdx808
SELECT *,LEFT(学号,4) bj FROM cj INTO CURSOR &xfilemc &&&没错啊,这个地方增加了bj字段
2023-12-20 10:12
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:105
注 册:2015-4-18
收藏
得分:0 
回复 7楼 laowan001
b( ̄▽ ̄)d学习了
2023-12-20 10:13
快速回复:请教各位老师,如何求出各种名次
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022109 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved