| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 303 人关注过本帖
标题:各位老师,这段代码错误在哪儿?xx
只看楼主 加入收藏
jinanshui
Rank: 2
等 级:论坛游民
帖 子:297
专家分:67
注 册:2009-10-6
结帖率:93.88%
收藏
 问题点数:20 回复次数:5 
各位老师,这段代码错误在哪儿?xx
现有一chengji.dbf表,字段为学号,姓名,语文,数学,英语,物理,化学,生物,历史,地理,政治。学号为字符型主字段前2位为年级,3到4位为班级,5到6位为考号,如何求各各年级的各班级的各学科的前45名(按学科成绩排序)的平均分?
最后结果的形式为
年级   班级   语文,数学,英语,物理,化学,生物,历史,地理,政治.

* 创建临时表用于存储结果
CREATE CURSOR result (年级 C(2), 班级 C(2), 语文 N(6,2), 数学 N(6,2), 外语 N(6,2), 物理 N(6,2), 化学 N(6,2), 生物 N(6,2), 历史 N(6,2), 地理 N(6,2), 政治 N(6,2))
* 定义科目数组
DIMENSION aSubjects[9]
aSubjects[1] = "语文"
aSubjects[2] = "数学"
aSubjects[3] = "外语"
aSubjects[4] = "物理"
aSubjects[5] = "化学"
aSubjects[6] = "生物"
aSubjects[7] = "历史"
aSubjects[8] = "地理"
aSubjects[9] = "政治"
* 获取所有不同的年级和班级组合
SELECT DISTINCT SUBSTR(ALLTRIM(学号), 1, 2) AS 年级, SUBSTR(ALLTRIM(学号), 3, 2) AS 班级 ;
FROM chengji ;
INTO CURSOR crsGradeClass
SCAN
    lcGrade = crsGradeClass.年级
    lcClass = crsGradeClass.班级
    LOCAL ARRAY aAvgScores(9)
    aAvgScores = 0
FOR nSubject = 1 TO 9
    lcSubject = aSubjects[nSubject]
* 对每个科目按成绩排序并取前45名的成绩计算平均值
    SELECT 学号, &lcSubject AS score ;
    FROM chengji ;
    WHERE SUBSTR(ALLTRIM(学号), 1, 4) = lcGrade + lcClass ;
    ORDER BY score DESC ;
    INTO CURSOR temp_scores
    IF RECCOUNT() >= 45
        SELECT AVG(score) FROM (SELECT TOP 45 score FROM temp_scores) INTO ARRAY aAvgScore
    ELSE
        SELECT AVG(score) FROM temp_scores INTO ARRAY aAvgScore
    ENDIF
    aAvgScores[nSubject] = aAvgScore[1]
    USE IN temp_scores
ENDFOR
    INSERT INTO result (年级, 班级, 语文, 数学, 外语, 物理, 化学, 生物, 历史, 地理, 政治) ;
    VALUES (lcGrade, lcClass, aAvgScores[1], aAvgScores[2], aAvgScores[3], aAvgScores[4], aAvgScores[5], aAvgScores[6], aAvgScores[7], aAvgScores[8], aAvgScores[9])
ENDSCAN
* 显示结果
SELECT result
BROWSE
搜索更多相关主题的帖子: SELECT 历史 学号 物理 数学 
前天 09:26
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:342
专家分:124
注 册:2015-4-18
收藏
得分:0 
你这是用哪个Ai写的,附上原数据表测试一下?错误提示是什么?

前天 11:08
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:325
专家分:786
注 册:2021-11-24
收藏
得分:0 
你要把  chengji  这个表含数据 传上来
前天 20:00
my2318
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:296
专家分:640
注 册:2014-3-18
收藏
得分:0 
很可能问题出在select语句上
前天 20:27
jinanshui
Rank: 2
等 级:论坛游民
帖 子:297
专家分:67
注 册:2009-10-6
收藏
得分:0 
各位老师,这是数据,请试一试
chengji.rar (34.07 KB)
昨天 02:37
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1854
专家分:3607
注 册:2012-2-29
收藏
得分:0 
回复 5楼 jinanshui
按一般思路求解,没有验证(好像有班级不足45人,同时第45名有并列情形)。
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
select *,left(学号,4) as 班级 from chengji into cursor _xscj
cstr = "班级,语文,数学,外语,物理,化学,生物,历史,地理,政治"
=alines(arr,cstr,",")
cfld = "班级 c(5)"
for i = 2 to alen(arr,1)
    cfld = cfld + "," + arr[i] + " n(6,2)"
endfor
select distinct 班级 from _xscj into array abj
create dbf 平均分 (&cfld)
append from array abj
for i = 2 to alen(arr,1)
    select 班级,&arr[i] from _xscj a where 44 >= (select count(*) from _xscj where 班级 = a.班级 and &arr[i] > a.&arr[i]) order by a.班级,a.&arr[i] desc into cursor _cj
    select 班级,avg(&arr[i]) as jf from _cj group by 1 into cursor qb
    update 平均分 set &arr[i] = qb.jf from 平均分,qb where alltrim(平均分.班级)==alltrim(qb.班级)
endfor 
select 平均分
go top
browse 
close all 

昨天 08:02
快速回复:各位老师,这段代码错误在哪儿?xx
数据加载中...
 
   



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

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