| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4226 人关注过本帖, 1 人收藏
标题:不同分数段人数统计的简易方法
只看楼主 加入收藏
lbwg
Rank: 2
等 级:论坛游民
帖 子:76
专家分:53
注 册:2011-8-21
收藏
得分:0 
如果在统计结果中接一个字段累人数计字段就好了。因为那样才是我们经常想用的结果。
每次我都是统计出分段数据导入到excel中继续用公式统计的,那位帮帮提示一下。
2014-03-18 09:47
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
还是照原
以下是引用taifu945在2014-3-17 13:27:04的发言:

你运行完第一条命令后先看看ABC中有没有数据,如果有数据,再看看CJTJ与ABC表结构是否相同。我这里实验过,是有结果的。要是你那实在不行,就用第二种方法,通过数组追加。都 都 
都一样,请麻烦全部代码贴一下,对照一下
2014-03-18 10:29
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
taifu945:
下面的语句插入何处

SELECT FSD.FS1,FSD.FS2,COUNT(*) RS FROM CJK WHERE BETWEEN(CJK.CJ,FSD.FS1,FSD.FS2) INTO TABLE ABC
USE CJTJ
APPEND FROM ABC
USE IN ABC
ERASE ABC.DBF

嫌烦的话也可以找数组帮忙:
SELECT FSD.FS1,FSD.FS2,COUNT(*) RS FROM CJK WHERE BETWEEN(CJK.CJ,FSD.FS1,FSD.FS2) INTO ARRAY ABC
USE CJTJ
APPEND FROM ARRAY ABC

2014-03-18 10:51
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
从实际工作出发,每个学校对每门课程分数段的要求也不一样,个人认为,最科学的方法应该是设计一张分数段表,里面保存不同的分数段。

坚守VFP最后的阵地
2014-03-18 15:12
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
根据大家反馈的情况,找了一个成绩表,重新写了段不同分数段人数统计的代码
cj.rar (10.89 KB)


程序代码:
*-创建一个分数段标准表,这个标准表可以是自由表,也可以是临时表
CREATE CURSOR bz (下限 N(3),上限 N(3))
NUM=10 && 10分一个分数段,或者手工建一个自由表,前提是分数必须为整数
FSD=80 && 共设置FSD个分数段
FOR I=1 TO FSD
    IF I=1
       INSERT INTO BZ VALUES (0,NUM-I)
    ELSE
       INSERT INTO BZ VALUES (NUM1+1,NUM1+NUM)
    ENDIF
    NUM1=上限
ENDFOR

CREATE CURSOR T2 (班级 C(4),课程 C(10),档次 C(10),人数 N(4)) && 保存统计结果的临时表

SELECT 班级,[语文] 课程,语文 成绩 FROM CJ ;
UNION ALL SELECT 班级,[数学] SX,数学 FROM CJ ;
UNION ALL SELECT 班级,[综合] ZH,综合 FROM CJ ;
UNION ALL SELECT 班级,[英语] YY,英语 FROM CJ ;
UNION ALL SELECT 班级,[总分] ZF,总分 FROM CJ INTO CURSOR T0

SELECT BZ
SCAN
   INSERT INTO T2 SELECT 班级,课程,PADL(BZ.下限,3,[0])+[-]+PADL(BZ.上限,3,[0]),COUNT(*) FROM T0 GROUP BY 1,2 WHERE BETWEEN(成绩,BZ.下限,BZ.上限)
ENDSCAN

CREATE CURSOR FSTJ (档次 C(7),语文 N(3),数学 N(3),综合 N(3),英语 N(3),总分 N(3))
INSERT INTO FSTJ (档次) SELECT PADL(BZ.下限,3,[0])+[-]+PADL(BZ.上限,3,[0]) 档次 FROM BZ
SELECT DISTINCT 班级 FROM T0 INTO CURSOR BJ
SCAN
   BJ1=班级
   BJ=[BJ]+ALLTRIM(班级) &&以班级名称做为表名称
   SELECT *,000 小计 FROM FSTJ INTO TABLE &BJ
   UPDATE &BJ SET 语文=T2.人数 FROM &BJ INNER JOIN T2 ON &BJ..档次=T2.档次 AND T2.课程=[语文] AND T2.班级==BJ1
   UPDATE &BJ SET 数学=T2.人数 FROM &BJ INNER JOIN T2 ON &BJ..档次=T2.档次 AND T2.课程=[数学] AND T2.班级==BJ1
   UPDATE &BJ SET 综合=T2.人数 FROM &BJ INNER JOIN T2 ON &BJ..档次=T2.档次 AND T2.课程=[综合] AND T2.班级==BJ1
   UPDATE &BJ SET 英语=T2.人数 FROM &BJ INNER JOIN T2 ON &BJ..档次=T2.档次 AND T2.课程=[英语] AND T2.班级==BJ1
   UPDATE &BJ SET 总分=T2.人数 FROM &BJ INNER JOIN T2 ON &BJ..档次=T2.档次 AND T2.课程=[总分] AND T2.班级==BJ1
   SELECT (BJ)
   REPLACE ALL 小计 WITH 语文+数学+综合+英语
   INSERT INTO (BJ) SELECT [合计],SUM(语文),SUM(数学),SUM(综合),SUM(英语),SUM(总分),SUM(小计) FROM (BJ)
ENDSCAN


[ 本帖最后由 sdta 于 2014-3-18 18:25 编辑 ]

坚守VFP最后的阵地
2014-03-18 18:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
仍然有硬編碼呢

授人以渔,不授人以鱼。
2014-03-18 18:40
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
在15楼的基础上,对代码做了部分修改
程序代码:
*-创建一个分数段标准表,这个标准表可以是自由表,也可以是临时表
CREATE CURSOR bz (下限 N(3),上限 N(3))
NUM=10 && 10分一个分数段,或者手工建一个自由表,前提是分数必须为整数
FSD=80 && 共设置FSD个分数段
FOR I=1 TO FSD
    IF I=1
       INSERT INTO BZ VALUES (0,NUM-I)
    ELSE
       INSERT INTO BZ VALUES (NUM1+1,NUM1+NUM)
    ENDIF
    NUM1=上限
ENDFOR

* 统一格式,便于统计
SELECT 班级,[语文] 课程,语文 成绩,SPACE(7) 分数段 FROM CJ ;
UNION ALL SELECT 班级,[数学] SX,数学,SPACE(7) 分数段 FROM CJ ;
UNION ALL SELECT 班级,[综合] ZH,综合,SPACE(7) 分数段 FROM CJ ;
UNION ALL SELECT 班级,[英语] YY,英语,SPACE(7) 分数段 FROM CJ ;
UNION ALL SELECT 班级,[总分] ZF,总分,SPACE(7) 分数段 FROM CJ INTO CURSOR T0 READWRITE
*BROWSE && 可以查看内容

* 划分分数段
UPDATE T0 SET 分数段=PADL(BZ.下限,3,[0])+[-]+PADL(BZ.上限,3,[0]) FROM BZ WHERE BETWEEN(T0.成绩,BZ.下限,BZ.上限)

* 统计不同分数段的人数
SELECT 班级,课程,分数段,COUNT(*) 人数 FROM T0 GROUP BY 1,2,3 INTO CURSOR T2

* 生成统计结果的模板
CREATE CURSOR FSTJ (分数段 C(7),语文 N(3),数学 N(3),综合 N(3),英语 N(3),总分 N(3))
INSERT INTO FSTJ (分数段) SELECT PADL(BZ.下限,3,[0])+[-]+PADL(BZ.上限,3,[0]) 档次 FROM BZ

* 生成不重复的班级名称,用于数据统计
SELECT DISTINCT 班级 FROM T0 INTO CURSOR BJ

* 生成最后的统计结果
SCAN
   BJ1=班级
   BJ=[BJ]+ALLTRIM(班级)
   SELECT *,000 小计 FROM FSTJ INTO TABLE &BJ
   UPDATE &BJ SET 语文=T2.人数 FROM &BJ INNER JOIN T2 ON &BJ..分数段=T2.分数段 AND T2.课程=[语文] AND T2.班级==BJ1
   UPDATE &BJ SET 数学=T2.人数 FROM &BJ INNER JOIN T2 ON &BJ..分数段=T2.分数段 AND T2.课程=[数学] AND T2.班级==BJ1
   UPDATE &BJ SET 综合=T2.人数 FROM &BJ INNER JOIN T2 ON &BJ..分数段=T2.分数段 AND T2.课程=[综合] AND T2.班级==BJ1
   UPDATE &BJ SET 英语=T2.人数 FROM &BJ INNER JOIN T2 ON &BJ..分数段=T2.分数段 AND T2.课程=[英语] AND T2.班级==BJ1
   UPDATE &BJ SET 总分=T2.人数 FROM &BJ INNER JOIN T2 ON &BJ..分数段=T2.分数段 AND T2.课程=[总分] AND T2.班级==BJ1
   SELECT (BJ)
   REPLACE ALL 小计 WITH 语文+数学+综合+英语
   INSERT INTO (BJ) SELECT [合计],SUM(语文),SUM(数学),SUM(综合),SUM(英语),SUM(总分),SUM(小计) FROM (BJ)
BROWSE
ENDSCAN




坚守VFP最后的阵地
2014-03-18 18:58
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用TonyDeng在2014-3-18 18:40:06的发言:

仍然有硬編碼呢
有话直说

坚守VFP最后的阵地
2014-03-18 19:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不是說了麽,就是有硬編碼。

授人以渔,不授人以鱼。
2014-03-18 19:09
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用TonyDeng在2014-3-18 19:09:26的发言:

不是說了麽,就是有硬編碼。
说清楚,否则要打屁股了

坚守VFP最后的阵地
2014-03-18 19:10
快速回复:不同分数段人数统计的简易方法
数据加载中...
 
   



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

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