| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3024 人关注过本帖
标题:如何能快速统计出各科分数值
只看楼主 加入收藏
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
结帖率:82%
收藏
已结贴  问题点数:20 回复次数:10 
如何能快速统计出各科分数值
因数据量很大,常规方法很慢,想用快速方法,不知道哪位大侠能实现或提供思路,不胜感激。
快速统计.zip (765 Bytes)
搜索更多相关主题的帖子: 如何 统计 
2016-04-06 14:48
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:0 
个人愚见,用正则表达式不过没有写过正则表达式。
2016-04-06 14:49
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:0 
这是一个同学的数据大约12000名同学数据
2016-04-06 14:55
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
数据表结构不规范,无法快速。一再强调,这类表文件的设计应该是“学号、姓名、课程名称、成绩”这样的结构。只有这种结构,才能用很简洁的命令达到你的目的,现在的结构只能编程解决。但是,编程解决也不见得就不“快速”,至少程序代码正确的情况下,出结果的速度应该不会太慢。
2016-04-06 15:40
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:20 
猜一下,结果是否这样?
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
CREATE CURSOR 成绩表 (成绩 C(1), 分数 I)
INSERT INTO 成绩表 VALUES ("A", 10)
INSERT INTO 成绩表 VALUES ("B", 8)
INSERT INTO 成绩表 VALUES ("C", 6)
INDEX on 成绩 TAG 成绩
USE 快速统计 ALIAS tt IN 0
FOR i = 1 TO FCOUNT("tt")
    cFieldName = FIELD(i, "tt")
    cmd = [SET RELATION TO ALLTRIM(] + cFieldName + [) INTO "成绩表"]
    SELECT tt
    EXECSCRIPT(cmd)
    CALCULATE SUM(成绩表.分数) FOR !EMPTY(EVALUATE(cFieldName)) TO n分数 IN "tt"
    ? cFieldName, n分数
ENDFOR
CLOSE DATABASES ALL
2016-04-06 15:52
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
Select Sum(Icase(语文 = "A", 10, 语文 = "B", 8, 6)) As 语文, ;
       Sum(Icase(数学 = "A", 10, 数学 = "B", 8, 6)) As 数学, ;
       Sum(Icase(英语 = "A", 10, 英语 = "B", 8, 6)) As 英语, ;
       Sum(Icase(物理 = "A", 10, 物理 = "B", 8, 6)) As 物理, ;
       Sum(Icase(化学 = "A", 10, 化学 = "B", 8, 6)) As 化学, ;
       Sum(Icase(生物 = "A", 10, 生物 = "B", 8, 6)) As 生物, ;
       Sum(Icase(政治 = "A", 10, 政治 = "B", 8, 6)) As 政治, ;
       Sum(Icase(历史 = "A", 10, 历史 = "B", 8, 6)) As 历史, ;
       Sum(Icase(地理 = "A", 10, 地理 = "B", 8, 6)) As 地理, ;
       Sum(Icase(体育 = "A", 10, 体育 = "B", 8, 6)) As 体育, ;
       Sum(Icase(美术 = "A", 10, 美术 = "B", 8, 6)) As 美术, ;
       Sum(Icase(音乐 = "A", 10, 音乐 = "B", 8, 6)) As 音乐, ;
       Sum(Icase(信技 = "A", 10, 信技 = "B", 8, 6)) As 信技, ;
       Sum(Icase(其它 = "A", 10, 其它 = "B", 8, 6)) As 其它  ;
  From 快速统计

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-06 15:54
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
*!*    12000名同学数据压力测试:

Clear
Set Talk Off
Close Databases All

*!*    构造12000名同学x9=108000条记录的测试数据:
Select 000001 As 学号, * From 快速统计 Where .F. Into Cursor Test Readwrite
For I = 1 To 12000
    Select I As 学号, * From 快速统计 Where Recno() < 10 Into Cursor Query
    Select Test
    Append From Dbf("Query")
Endfor


*!*    压力测试:约 6秒
T1 = Seconds( )
Select 学号, ;
       Sum(Icase(语文 = "A", 10, 语文 = "B", 8, 6)) As 语文, ;
       Sum(Icase(数学 = "A", 10, 数学 = "B", 8, 6)) As 数学, ;
       Sum(Icase(英语 = "A", 10, 英语 = "B", 8, 6)) As 英语, ;
       Sum(Icase(物理 = "A", 10, 物理 = "B", 8, 6)) As 物理, ;
       Sum(Icase(化学 = "A", 10, 化学 = "B", 8, 6)) As 化学, ;
       Sum(Icase(生物 = "A", 10, 生物 = "B", 8, 6)) As 生物, ;
       Sum(Icase(政治 = "A", 10, 政治 = "B", 8, 6)) As 政治, ;
       Sum(Icase(历史 = "A", 10, 历史 = "B", 8, 6)) As 历史, ;
       Sum(Icase(地理 = "A", 10, 地理 = "B", 8, 6)) As 地理, ;
       Sum(Icase(体育 = "A", 10, 体育 = "B", 8, 6)) As 体育, ;
       Sum(Icase(美术 = "A", 10, 美术 = "B", 8, 6)) As 美术, ;
       Sum(Icase(音乐 = "A", 10, 音乐 = "B", 8, 6)) As 音乐, ;
       Sum(Icase(信技 = "A", 10, 信技 = "B", 8, 6)) As 信技, ;
       Sum(Icase(其它 = "A", 10, 其它 = "B", 8, 6)) As 其它  ;
  From Test Group By 学号 NOWAIT
  =Messagebox("耗时 : " + Transform(Seconds() - T1) + " 秒")
  Browse Last

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-06 16:26
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
*!*    方法二:算法:12 - 2n  (n = ASC("科目名称") - 64)
Select Sum(12 - 2*(Asc(语文) - 64)) As 语文, ;
       Sum(12 - 2*(Asc(数学) - 64)) As 数学, ;
       Sum(12 - 2*(Asc(英语) - 64)) As 英语, ;
       Sum(12 - 2*(Asc(物理) - 64)) As 物理, ;
       Sum(12 - 2*(Asc(化学) - 64)) As 化学, ;
       Sum(12 - 2*(Asc(生物) - 64)) As 生物, ;
       Sum(12 - 2*(Asc(政治) - 64)) As 政治, ;
       Sum(12 - 2*(Asc(历史) - 64)) As 历史, ;
       Sum(12 - 2*(Asc(地理) - 64)) As 地理, ;
       Sum(12 - 2*(Asc(体育) - 64)) As 体育, ;
       Sum(12 - 2*(Asc(美术) - 64)) As 美术, ;
       Sum(12 - 2*(Asc(音乐) - 64)) As 音乐, ;
       Sum(12 - 2*(Asc(信技) - 64)) As 信技, ;
       Sum(12 - 2*(Asc(其它) - 64)) As 其它 ;
  From 快速统计

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-06 16:56
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2214
专家分:3882
注 册:2007-4-27
收藏
得分:0 
浙江省的高中生学业水平考试成绩反馈回来就是这种ABCDE的。数据转换必须写代码。速度应该也是可以的

只求每天有一丁点儿的进步就可以了
2016-04-06 17:27
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
5楼的代码附合要求
2016-04-08 09:48
快速回复:如何能快速统计出各科分数值
数据加载中...
 
   



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

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