| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4999 人关注过本帖
标题:如何统计成绩库.dbf中各科总分、平均分、最高分、最低分、及格人数、优分人 ...
只看楼主 加入收藏
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:987
专家分:4946
注 册:2013-2-16
收藏
得分:4 
这个统计,首先是一个把透视表结构,转换为普通表的问题。
当然,也可以不转换,但是转换后,后面的分类统计代码要好写得多,一条Sql语句就搞定。
所以我的思路是先转换表结构,横表转纵表,代码参考如下:
程序代码:
SET SAFETY OFF 
CLOSE DATABASES 
* 准备基础表:
CREATE CURSOR AA (km c(10), 及格 n(6, 2), 优秀 n(6, 2))
INSERT INTO AA VALUES ("语文", 72, 102)
INSERT INTO AA VALUES ("数学", 90, 127.5)
INSERT INTO AA VALUES ("英语", 90, 127.5)
INSERT INTO AA VALUES ("科学", 96, 136)
INSERT INTO AA VALUES ("历史社会", 36, 51)
INSERT INTO AA VALUES ("生物", 18, 25.5)
INSERT INTO AA VALUES ("地理", 18, 25.5)
INSERT INTO AA VALUES ("实验操作", 12, 17)
INSERT INTO AA VALUES ("体育", 48, 68)
USE c:\users\administrator\desktop\成绩分析\成绩库.dbf IN 0 SHARED

IF USED('cjb') THEN 
    USE IN cjb
ENDIF 
IF  pvt2tab( '成绩库','cjb','科目','成绩',1,9  )>0 THEN  && 透视表转为普通表
    USE IN 成绩库
    ALTER table cjb ADD COLUMN 不及格 i ;
        ADD COLUMN 及格 i ;
        ADD COLUMN 优秀 i ADD COLUMN 总人数 i 
    
    UPDATE cjb SET cjb.优秀 =1 from aa WHERE cjb.科目 = aa.km AND cjb.成绩 >=aa.优秀
    UPDATE cjb SET cjb.及格 =1 from aa WHERE cjb.科目 = aa.km AND cjb.成绩 >=aa.及格 AND cjb.成绩 <aa.优秀
    UPDATE cjb SET cjb.不及格 =1 from aa WHERE cjb.科目 = aa.km AND cjb.成绩 <aa.及格     
    UPDATE cjb SET cjb.总人数 = cjb.不及格 + cjb.及格 + cjb.优秀 
    * 横表转为纵表后,统计起来相对容易些 
    SELECT cjb.科目,sum(cjb.成绩) as 总和,AVG(cjb.成绩) as 平均分, ;
        MAX(cjb.成绩) as 最高分,MIN(cjb.成绩) as 最低分, ;
        SUM(cjb.不及格) as 不及格人数,SUM(cjb.及格) as 及格人数, ;
        SUM(cjb.优秀) as 优分人数 ,SUM(cjb.总人数) as 总人数 ;
      FROM cjb ;
      GROUP BY cjb.科目 ;
      INTO CURSOR tmptj     

    MESSAGEBOX('统计完毕',64,'成绩统计',3000) 
ENDIF 

FUNCTION  pvt2tab  &&  透视表转为普通表
LPARAMETERS cTab ,cOut,col1,col2,icol1,icol2 
* 参数含义:源表,目的表,新列名1,新列名2,起始列,终止列
* 这里为了简捷,不再检测参数了.
LOCAL fn ,fval
fval=0
fn=""
CREATE CURSOR &cOut (&col1 c(20) ,&col2 B )
SELECT &cTab
GO TOP 
SCAN 
    FOR ii=icol1 TO icol2
        fn=FIELD(ii)
        fval=&fn
        INSERT INTO &cOut (&col1 ,&col2 ) VALUES (fn,fval)
    ENDFOR 
ENDSCAN 
RETURN RECCOUNT(cOut) 
ENDFUNC  


[此贴子已经被作者于2020-4-15 14:03编辑过]

2020-04-15 13:58
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:987
专家分:4946
注 册:2013-2-16
收藏
得分:0 
最后的效果:
图片附件: 游客没有浏览图片的权限,请 登录注册
2020-04-15 13:59
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:987
专家分:4946
注 册:2013-2-16
收藏
得分:0 
我认为[不及格]、[及格]、[优秀] 是三个档, 所以他们是互斥的,他们之和,应该=总人数。
当然,这只是我个人见解,也有可能我是错的,只是抛砖引玉而已。
2020-04-15 14:01
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2197
专家分:3838
注 册:2007-4-27
收藏
得分:0 
一般在划分成绩等第时,A、B、C、E,各等和=总人数,但算及格率时=(A+B+C)/总人数*100%

只求每天有一丁点儿的进步就可以了
2020-04-15 16:43
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用厨师王德榜在2020-4-15 14:01:01的发言:

我认为[不及格]、[及格]、[优秀] 是三个档, 所以他们是互斥的,他们之和,应该=总人数。
当然,这只是我个人见解,也有可能我是错的,只是抛砖引玉而已。

学校里工作的人表示,你的逻辑更符合大多数场合下的统计。
2020-04-15 18:24
王咸美
Rank: 1
等 级:新手上路
帖 子:579
专家分:0
注 册:2018-1-4
收藏
得分:0 
@厨师王德榜 首先十分感谢你的帮助,其次要说明的是:所有优分人数均含在及格人数之内,知道了总人数和及格人数就知道了不及格人数,你提供的代码有点小问题:及格人数不对。
2020-04-16 17:34
chychychy
Rank: 2
等 级:论坛游民
帖 子:191
专家分:91
注 册:2015-4-18
收藏
得分:0 
回复 10楼 sdta
测试正确如下:
CLOSE DATABASES
CREATE CURSOR bz (km c(10), n1 n(6, 2), n2 n(6, 2))
INSERT INTO bz VALUES ("语文", 72, 102)
INSERT INTO bz VALUES ("数学", 90, 127.5)
INSERT INTO bz VALUES ("英语", 90, 127.5)
INSERT INTO bz VALUES ("科学", 96, 136)
INSERT INTO bz VALUES ("历史社会", 36, 51)
INSERT INTO bz VALUES ("生物", 18, 25.5)
INSERT INTO bz VALUES ("地理", 18, 25.5)
INSERT INTO bz VALUES ("实验操作", 12, 17)
INSERT INTO bz VALUES ("体育", 48, 68)
SELECT n1, n2 FROM bz INTO ARRAY abz

USE 统计表 IN 0
SELECT 统计表
ZAP

USE 成绩库 IN 0
SELECT 成绩库
LOCAL atj[1, 7]
FOR i = 1 TO FCOUNT() - 1
    atj[1, 1] = FIELD(i)
    CALCULATE SUM(EVALUATE(FIELD(i))), AVG(EVALUATE(FIELD(i))), MAX(EVALUATE(FIELD(i))), MIN(EVALUATE(FIELD(i))) TO atj[1, 2], atj[1, 3], atj[1, 4], atj[1, 5]
    COUNT TO atj[1, 6] FOR EVALUATE(FIELD(i)) >= abz[i, 1]
    COUNT TO atj[1, 7] FOR EVALUATE(FIELD(i)) >= abz[i, 2]

    INSERT INTO 统计表 FROM ARRAY atj
    atj = 0
ENDFOR
SELECT 统计表
BROWSE

[此贴子已经被作者于2023-10-13 09:11编辑过]

2023-10-13 09:07
快速回复:如何统计成绩库.dbf中各科总分、平均分、最高分、最低分、及格人数、优 ...
数据加载中...
 
   



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

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