以下是引用TonyDeng在2015-8-18 17:44:45的发言:
你这个表是会随着时间的推移不断增大的,统计动作不能聚集在原表上。
你这个表是会随着时间的推移不断增大的,统计动作不能聚集在原表上。
那应该是怎么一个思想呢?请版主明示。
程序代码:CLOSE DATABASES
CLEAR ALL
USE CHENGJIBIAO ALIAS CJB IN 0
NZDS=AFIELDS(AZDM)
USE IN CJB
* 生成SQL查询字段列表(好处在于不需要知道科目字段的排列顺序,只要科目字段排在一起就可以了)
CSQL="SELECT 考试ID,班级ID"
FOR LNI=4 TO NZDS && 从第4列开始统计
CSQL=CSQL+",CAST(AVG("+AZDM[LNI,1]+") AS N(6,2)) "+AZDM[LNI,1]+"均分,000 "+AZDM[LNI,1]+"名次"+IIF(LNI<NZDS,""," FROM CHENGJIBIAO GROUP BY 1,2 INTO CURSOR CJTJB READWRITE")
ENDFOR
*MESSAGEBOX(CSQL,64,"生成代码提示")
EXECSCRIPT(CSQL)
* 排名次(如果更新数据超过5000条,要考虑用VFP写代码了)
NZDS=AFIELDS(AZDM)
FOR LNI=3 TO NZDS STEP 2
A1="CJTJB."+AZDM[LNI,1] && 科目均分
B1="CJTJB."+AZDM[LNI+1,1] && 科目名次
A2="B."+AZDM[LNI,1] && 科目均分
UPDATE CJTJB SET &B1=(SELECT COUNT(*)+1 FROM CJTJB B WHERE &A1. <&A2. AND CJTJB.考试ID=B.考试ID) FROM CJTJB WHERE &A1. <>0
ENDFOR
* 显示统计结果
BROWSE

程序代码:FOR LNI = 3 TO nFieldCount STEP 2
A1 = 'CJTJB.' + aFieldList[LNI,1] && 科目均分
B1 = 'CJTJB.' + aFieldList[LNI+1,1] && 科目名次
A2 = 'B.' + aFieldList[LNI,1] && 科目均分
UPDATE CJTJB SET &B1=(SELECT COUNT(*)+1 FROM CJTJB B WHERE &A1.< &A2. AND CJTJB.考试ID = B.考试ID) FROM CJTJB WHERE &A1.<> 0
ENDFORUPDATE CJTJB SET CJTJB.语文名次=(SELECT COUNT(*)+1 FROM CJTJB B WHERE CJTJB.语文均分< B.语文均分 AND CJTJB.考试ID = B.考试ID) FROM CJTJB WHERE CJTJB.语文均分<>0