| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1423 人关注过本帖
标题:多次考试、多个班级、多个学科求平均分及名次问题
只看楼主 加入收藏
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:171
专家分:19
注 册:2013-8-12
收藏
得分:0 
以下是引用TonyDeng在2015-8-18 17:44:45的发言:

你这个表是会随着时间的推移不断增大的,统计动作不能聚集在原表上。



那应该是怎么一个思想呢?请版主明示。
2015-08-18 18:19
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:34 
程序代码:
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

坚守VFP最后的阵地
2015-08-18 18:25
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:171
专家分:19
注 册:2013-8-12
收藏
得分:0 
谢谢版主的回复,我先细细研究一下您的代码。
2015-08-18 18:31
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:171
专家分:19
注 册:2013-8-12
收藏
得分:0 
回复 12楼 sdta
谢谢 sdta 大侠,高手就是高手,您的代码完美解决我的问题。

原本我也是想用拼接SQL命令的方式来解决,但我以为有什么我不知道的命令或方法能解决这种 学科名不固定、学科数量不固定的统计。看来是没有了。

您的代码我有一处地方不太明白,请指教:
程序代码:
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
ENDFOR


UPDATE一句取 LNI = 3 的值为:
UPDATE CJTJB SET CJTJB.语文名次=(SELECT COUNT(*)+1 FROM CJTJB B WHERE CJTJB.语文均分< B.语文均分 AND CJTJB.考试ID = B.考试ID) FROM CJTJB WHERE CJTJB.语文均分<>0


这里的WHERE CJTJB.语文均分<>0 我不明白,是限制统计成绩不为.NULL.的吗?

如果 考试ID=1 这次考试 语文学科 没有参与,那么在 CJTJB 表中,语文均分 字段应该是 .NULL. 啊。

[ 本帖最后由 eepcvfp 于 2015-8-18 20:03 编辑 ]
2015-08-18 20:00
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:0 
回复 14楼 eepcvfp
对照CJTJB看就明白了
表中科目字段的NULL我去掉了
科目均分如果为 0 ,所有科目的名次都为1,因此失去了排名次的意义,故最后条件限制 &A1. <>0

[ 本帖最后由 sdta 于 2015-8-18 20:47 编辑 ]

坚守VFP最后的阵地
2015-08-18 20:25
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:171
专家分:19
注 册:2013-8-12
收藏
得分:0 
但我运行您的代码后 CJTJB 里没有参加考试的学科依然是.NULL.啊?不过 学科名次 字段是 0(零)。

这个论坛好像无法直接贴图,我只好把截图发一个附件了。

2015-08-18 20:40
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:171
专家分:19
注 册:2013-8-12
收藏
得分:0 
Snap1.zip (163.39 KB)
2015-08-18 20:41
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

坚守VFP最后的阵地
2015-08-18 20:45
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:0 
看15楼回帖

坚守VFP最后的阵地
2015-08-18 20:47
eepcvfp
Rank: 2
等 级:论坛游民
帖 子:171
专家分:19
注 册:2013-8-12
收藏
得分:0 
原来是这样,这就好理解了。

但我这边学科字段是允许NULL的,CJTJB 里没有参加考试的学科都是.NULL.,但为什么能运行通过呢?

学科字段为NULL也满足 &A1. <>0 对吗? 我以为必须要 not isnull(&A1.) 呢!


2015-08-18 20:54
快速回复:多次考试、多个班级、多个学科求平均分及名次问题
数据加载中...
 
   



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

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