在vf中创建了学生单科成绩表,如何将各科科成绩表复制到汇总表里 100
比如已将创建好了表化学成绩(学号,成绩);语文成绩(学号,成绩),现在要制作一个学生成绩汇总表(学号,姓名,化学成绩,语文成绩,平均成绩,名次),最关键的就是单科成绩如何...
比如已将创建好了表化学成绩(学号,成绩);语文成绩(学号,成绩),现在要制作一个学生成绩汇总表(学号,姓名,化学成绩,语文成绩,平均成绩,名次),最关键的就是单科成绩如何复制过来,用update不成功,只能更新一条语句,不知道为什么,还有名次,用什么函数生成,谢谢大神啊
展开
1个回答
展开全部
我先整理下你的情况:
提供的表为各科成绩表: 化学成绩,语文成绩
现在需要生成一个汇总表:成绩汇总表
有2个方法,一个是使用sql语句, 精炼快速, 不过语句比较复杂, 不容易掌握; 另一个就是用vfp的命令,语句比较多
假定已经有一个空表成绩汇总表
方法一:
严格来说,这个成绩表设计不合理,因为有可能一个学号,化学成绩表里有记录,而语文成绩表没记录. 为了考虑这个因素, 这个sql语句就更复杂了.
最佳设计应该是一个成绩表,化学,语文作为字段:学号,化学成绩,语文成绩. 这样在录入数据时,就不可能有某人只有化学成绩,而没有语文成绩
另外名次没法一下子生成,因为一般的排名次是同样分数,名次相同.(如果同样分数名次不同, 很简单,按从高到低排序,然后填充序号即可)
insert into 成绩汇总表 ;
select iif(isnull(学号1),学号2,学号1) as 学号,iif(isnull(化学成绩),0,化学成绩) as 化学成绩, ;
iif(isnull(语文成绩),0,语文成绩) as 语文成绩,000 as 平均成绩,000 as 名次 from ;
(select a.学号 as 学号1,b.学号 as 学号2,a.成绩 as 化学成绩,b.成绩 as 语文成绩 ;
from 化学成绩 a full outer join 语文成绩 b on a.学号=b.学号)
*--方法一和方法二的区别就是上面的代码, 后面的都相同
select 成绩汇总表
replace all 平均成绩 with (化学成绩+语文成绩)/2
index on 平均成绩 tag pjcj deasending &&按从高到低排序,即倒序
lastcj=-1 &&设置一个与所有成绩都不同的值, 作为上一成绩的初始值. 就是为了比对与上一成绩是否相同,相同就同一名次
mc=0 &&名次的初始值
scan
if 平均成绩<>lastcj &&如果本学生的平均成绩和上一学生的相等, 名次就不加1
mc=mc+1
endif
replace 名次 with mc
endscan
方法二:
select 化学成绩
scan
select 成绩汇总表
append blank
replace 学号 with 化学成绩.学号,化学成绩 with 化学成绩.成绩,语文成绩 with 0
endscan
select 语文成绩
scan
select 成绩汇总表
locate for 学号=语文成绩.学号
if found()
replace 成绩 with 语文成绩.成绩
else
append blank
replace 学号 with 语文成绩.学号,化学成绩 with 0,语文成绩 with 语文成绩.成绩
endif
endscan
*--方法一和方法二的区别就是上面的代码, 后面的都相同
select 成绩汇总表
replace all 平均成绩 with (化学成绩+语文成绩)/2
index on 平均成绩 tag pjcj deasending &&按从高到低排序,即倒序
lastcj=-1 &&设置一个与所有成绩都不同的值, 作为上一成绩的初始值. 就是为了比对与上一成绩是否相同,相同就同一名次
mc=0 &&名次的初始值
scan
if 平均成绩<>lastcj &&如果本学生的平均成绩和上一学生的相等, 名次就不加1
mc=mc+1
endif
replace 名次 with mc
endscan
提供的表为各科成绩表: 化学成绩,语文成绩
现在需要生成一个汇总表:成绩汇总表
有2个方法,一个是使用sql语句, 精炼快速, 不过语句比较复杂, 不容易掌握; 另一个就是用vfp的命令,语句比较多
假定已经有一个空表成绩汇总表
方法一:
严格来说,这个成绩表设计不合理,因为有可能一个学号,化学成绩表里有记录,而语文成绩表没记录. 为了考虑这个因素, 这个sql语句就更复杂了.
最佳设计应该是一个成绩表,化学,语文作为字段:学号,化学成绩,语文成绩. 这样在录入数据时,就不可能有某人只有化学成绩,而没有语文成绩
另外名次没法一下子生成,因为一般的排名次是同样分数,名次相同.(如果同样分数名次不同, 很简单,按从高到低排序,然后填充序号即可)
insert into 成绩汇总表 ;
select iif(isnull(学号1),学号2,学号1) as 学号,iif(isnull(化学成绩),0,化学成绩) as 化学成绩, ;
iif(isnull(语文成绩),0,语文成绩) as 语文成绩,000 as 平均成绩,000 as 名次 from ;
(select a.学号 as 学号1,b.学号 as 学号2,a.成绩 as 化学成绩,b.成绩 as 语文成绩 ;
from 化学成绩 a full outer join 语文成绩 b on a.学号=b.学号)
*--方法一和方法二的区别就是上面的代码, 后面的都相同
select 成绩汇总表
replace all 平均成绩 with (化学成绩+语文成绩)/2
index on 平均成绩 tag pjcj deasending &&按从高到低排序,即倒序
lastcj=-1 &&设置一个与所有成绩都不同的值, 作为上一成绩的初始值. 就是为了比对与上一成绩是否相同,相同就同一名次
mc=0 &&名次的初始值
scan
if 平均成绩<>lastcj &&如果本学生的平均成绩和上一学生的相等, 名次就不加1
mc=mc+1
endif
replace 名次 with mc
endscan
方法二:
select 化学成绩
scan
select 成绩汇总表
append blank
replace 学号 with 化学成绩.学号,化学成绩 with 化学成绩.成绩,语文成绩 with 0
endscan
select 语文成绩
scan
select 成绩汇总表
locate for 学号=语文成绩.学号
if found()
replace 成绩 with 语文成绩.成绩
else
append blank
replace 学号 with 语文成绩.学号,化学成绩 with 0,语文成绩 with 语文成绩.成绩
endif
endscan
*--方法一和方法二的区别就是上面的代码, 后面的都相同
select 成绩汇总表
replace all 平均成绩 with (化学成绩+语文成绩)/2
index on 平均成绩 tag pjcj deasending &&按从高到低排序,即倒序
lastcj=-1 &&设置一个与所有成绩都不同的值, 作为上一成绩的初始值. 就是为了比对与上一成绩是否相同,相同就同一名次
mc=0 &&名次的初始值
scan
if 平均成绩<>lastcj &&如果本学生的平均成绩和上一学生的相等, 名次就不加1
mc=mc+1
endif
replace 名次 with mc
endscan
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询