| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2384 人关注过本帖
标题:新手请教:名次分段统计
只看楼主 加入收藏
bb2504
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-6-12
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
新手请教:名次分段统计
现有学生成绩表cj,含有 学校,班级,考号,姓名,学科成绩,学科名次等字段,如下图
图片附件: 游客没有浏览图片的权限,请 登录注册

请教各位高手,如何分段统计给定的名次段的人数,效果如图:
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 分段 统计 姓名 字段 效果 
2017-10-31 08:12
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9798
专家分:26886
注 册:2012-2-5
收藏
得分:10 
上传相关文件

坚守VFP最后的阵地
2017-10-31 10:13
booksoon
Rank: 2
等 级:论坛游民
威 望:3
帖 子:19
专家分:67
注 册:2017-10-30
收藏
得分:10 
sql语句实在不好写,最笨的办法就是用一个循环
2017-10-31 10:30
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9798
专家分:26886
注 册:2012-2-5
收藏
得分:0 
这种表结构处理数据不方便。
合理的表结构应该是
学校
班级
考号
姓名
科目
成绩
思路:按学校+科目 索引或者排序,将表扫描一遍,各科目的名次就出来了,然后合并各科目各班级相应名次的人数

[此贴子已经被作者于2017-10-31 11:17编辑过]


坚守VFP最后的阵地
2017-10-31 10:37
bb2504
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-6-12
收藏
得分:0 
谢谢,我研究研究吧
2017-10-31 10:53
bb2504
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-6-12
收藏
得分:0 

附件已上传,有大师有空闲可以做试试,结果做成统计表(tjb)样子的。
cj.rar (3.26 KB)


2017-10-31 11:09
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9798
专家分:26886
注 册:2012-2-5
收藏
得分:0 
示例:
程序代码:
* 分科取前N名人数统计
t1=SECONDS()
CLOSE DATABASES ALL 
SET SAFETY OFF 
LOCAL akm[6],nxx,nbj
akm[1]="语文"
akm[2]="数学"
akm[3]="英语"
akm[4]="物理"
akm[5]="化学"
akm[6]="生物"
nxx=10 && 共10所学校
nbj=10 && 每所学校10个班
nrs=50 && 每个班50人
=RAND(-1)
IF NOT FILE("tcjb.dbf")
    * 生成测试数据
    CREATE TABLE tcjb (学校 c(2),班级 c(4),学号 c(6),科目 c(4),科目编号 N(1),成绩 n(3))
    FOR i=1 TO nxx && 学校
        FOR ii=1 TO nbj && 班级
            FOR iii=1 TO ALEN(akm,1) && 科目
                FOR iiii=1 TO nrs && 人数
                    INSERT INTO tcjb VALUES (PADL(i,2,"0"),PADL(i,2,"0")+PADL(ii,2,"0"),PADL(i,2,"0")+PADL(ii,2,"0")+PADL(iiii,2,"0"),akm[iii],iii,RAND()*100)
                ENDFOR 
            ENDFOR 
        ENDFOR 
    ENDFOR 
ENDIF 
=SYS(3099,70) && 如果是VFP6.0,注释掉该行代码
SELECT *,00000 名次,SPACE(8) 类别 FROM tcjb ORDER BY 科目编号,成绩 DESC INTO CURSOR t1 READWRITE && 各科成绩及名次表

 
* 排名次
nrs=1 && 记录科目人数
ncj=0 && 记录科目成绩
ckm="" && 记录科目名称
nmc=1  && 记录科目名次
SCAN
    IF 科目!=ckm
       STORE 1 TO nrs,nmc
    ENDIF
    IF 成绩!=ncj
        nmc=nrs
    ENDIF
    REPLACE 名次 WITH nmc
    nrs=nrs+1
    ckm=科目
    ncj=成绩   
ENDSCAN
* 前N名字符串
cmc="3,10,20,50,100,200,500,1000,1500"
* [color=#808080]=ALINES(amc,CHRTRAN(cmc,",",CHR(10)+CHR(13))) && VFP6.0用该行代码[/color]
=ALINES(amc,cmc,",") && 如果是VFP6.0注释掉该行代码
* 为每条记录赋 前N名 值
FOR i=1 TO ALEN(amc,1)
    REPLACE 类别 WITH "前"+PADL(amc[i],4,"0")+"名" FOR 名次<=VAL(amc[i]) AND EMPTY(类别)
ENDFOR 
SELECT *,COUNT(*) rs,00 人数 FROM t1 WHERE NOT EMPTY(类别) GROUP BY 学校,班级,科目编号,类别 ORDER BY 学校,班级,科目编号,类别 INTO CURSOR t2 READWRITE && 分科前N名表

 
* 修正分组数据 (如表中的 前20名 范围是11[color=#808080]-20,前50名 的范围是21-50),人数 字段值为修正后的前N名数据[/color]
ckm=""
nrs=0
SCAN 
    IF 科目==ckm
        REPLACE 人数 WITH rs+nrs   
    ELSE
        REPLACE 人数 WITH rs 
    ENDIF 
    nrs=人数
    ckm=科目
ENDSCAN

* 生成成绩、名次统计表及结构
cfield="学校 c(2),班级 c(4),学号 c(6)"
cfield1=""
cfield2=""
FOR i=1 TO ALEN(akm,1)
    cfield=cfield+","+akm[i]+" N(4)"
    cfield1=cfield1+","+akm[i]+"名次 N(4)"
    cfield2=cfield2+IIF(EMPTY(cfield2),"","+")+akm[i]
ENDFOR
cfield=cfield+",总分 N(4)"+cfield1
CREATE CURSOR tjb1 (&cfield)
INSERT INTO tjb1 (学校,班级,学号) SELECT DISTINCT 学校,班级,学号 FROM t1
INDEX ON 学校+班级+学号 TAG px
SELECT t1
SET RELATION TO 学校+班级+学号 INTO tjb1
SCAN
    REPLACE (t1.科目) WITH t1.成绩,(t1.科目+"名次") WITH t1.名次 IN tjb1
ENDSCAN

 
SELECT tjb1
REPLACE 总分 WITH &cfield2 ALL 
SET RELATION TO
* 生成分科前N名人数统计表及结构
SELECT DISTINCT 类别 FROM t2 INTO ARRAY alb
cfield="学校 c(2),班级 c(4),科目 c(4),科目编号 n(1)"
cfield1="学校,班级,科目"
FOR i=1 TO ALEN(alb,1)
    cfield=cfield+","+alb[i]+" N(2)"
    cfield1=cfield1+","+alb[i] && 下面SQL命令中的列表字段
ENDFOR
CREATE CURSOR TJB2 (&cfield)
INSERT INTO tjb2 (学校,班级,科目,科目编号) SELECT 学校,班级,科目,科目编号 FROM t2 GROUP BY 学校,班级,科目编号 ORDER BY 学校,班级,科目编号
INDEX ON 学校+班级+STR(科目编号) TAG px
SELECT t2
SET RELATION TO 学校+班级+STR(科目编号) INTO tjb2
SCAN
    REPLACE (t2.类别) WITH t2.人数 IN tjb2
ENDSCAN
SET RELATION TO
SELECT &cfield1 FROM tjb2 INTO CURSOR tjb2
MESSAGEBOX("共运行:"+TRANSFORM(SECONDS()-t1)+" 秒")
SET ORDER TO
GO TOP 
BROWSE TITLE "分科前N名人数统计表"
SELECT tjb1
SET ORDER TO 
GO TOP 
BROWSE TITLE "成绩、名次统计表"

坚守VFP最后的阵地
2017-10-31 18:20
bb2504
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-6-12
收藏
得分:0 
感谢大神
2017-10-31 18:36
快速回复:新手请教:名次分段统计
数据加载中...
 
   



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

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