标题:如何统计成绩库.dbf中各科总分、平均分、最高分、最低分、及格人数、优分人 ...
只看楼主
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册: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: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:0 
最后的效果:
2020-04-15 13:59
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:0 
我认为[不及格]、[及格]、[优秀] 是三个档, 所以他们是互斥的,他们之和,应该=总人数。
当然,这只是我个人见解,也有可能我是错的,只是抛砖引玉而已。
2020-04-15 14:01
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册: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
等 级:新手上路
帖 子:569
专家分:0
注 册:2018-1-4
得分:0 
@厨师王德榜 首先十分感谢你的帮助,其次要说明的是:所有优分人数均含在及格人数之内,知道了总人数和及格人数就知道了不及格人数,你提供的代码有点小问题:及格人数不对。
2020-04-16 17:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501051-1-1.html




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

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