[此贴子已经被作者于2017-10-31 11:17编辑过]
* 分科取前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 "成绩、名次统计表"