示例:
程序代码:
* 分科取前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 "成绩、名次统计表"