这个统计,首先是一个把透视表结构,转换为普通表的问题。
当然,也可以不转换,但是转换后,后面的分类统计代码要好写得多,一条Sql语句就搞定。
所以我的思路是先转换表结构,横表转纵表,代码参考如下:
当然,也可以不转换,但是转换后,后面的分类统计代码要好写得多,一条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编辑过]