标题:求助学生分数段统计
只看楼主
chychychy
Rank: 2
等 级:论坛游民
帖 子:126
专家分:18
注 册:2015-4-18
结帖率:100%
已结贴  问题点数:20 回复次数:24 
求助学生分数段统计
有数据库1原始学生成绩库(zcj.dbf),主要字段有czxx\czxxdm\bjdm\zf,分别为初中学校、初中学校代码、班级代码、总分等
导出一学校名称表(xxmc.dbf)主要字段有czxxdm\czxx\,分别为初中学校代码、初中学校;简单计算产生一分数段设置表(fsd.dbf)主要字段有N\F1\F2,分别为计数字段、低分字段、高分字段。按照分数段设置和学校名称表内容,统计出各学校相应分数段人数,一种是包含前一分数段,一种是不包含前一分数段
总成绩.rar (166.75 KB)

部分学习代码:
select distinct czxxdm  from zcj into table xxmc &&&去重取出所有czxxdm字段,???请教如何同时让xxmc表包含czxx和czxxdm两个字段
select min(zf) df, max(zf) gf from zcj into array fs
ndf=fs[1,1]
ngf=fs[1,2]
ngf=CEILING(ngf/10)*10
fsd=10 && 此处分数段可以更改
zds=CEILING((ngf-ndf)/fsd)+1 && 可设置的字段数,用函数取整
messagebox("当前字段数:"+transform(zds))
F11=ngf &&&&定义变量值
* 创建分数段表
create table fsd (n n(4), f1 n(4,2),f2 n(4,2)) &&&&创建表fsd三个数值型字段N\F1\F2
for i=1 to zds
    insert into fsd values (i,f11-fsd+0.1,f11)
    f11=f11-fsd
endfor
* 创建统计表tjb1一包含前一分数段
???
* 创建统计表tjb2二不包含前一分数段
???
实现下图效果统计数据库
 
搜索更多相关主题的帖子: 学校 包含 字段 统计 分数 
2020-08-30 09:03
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
select distinct czxxdm, czxx from zcj into table xxmc

坚守VFP最后的阵地
2020-08-30 10:45
chychychy
Rank: 2
等 级:论坛游民
帖 子:126
专家分:18
注 册:2015-4-18
得分:0 
回复 2楼 sdta
谢谢,我之前漏了逗号,后来是中文逗号,怪不得错误。另请教创建统计表tjb1一包含前一分数段代码,之前读过你的其他帖子,主要是命令太复杂,很多我没学过看不懂,请用简单prg指教。

[此贴子已经被作者于2020-8-30 10:54编辑过]

2020-08-30 10:51
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:10 
* VFP9代码_累加方式(后一分数段人数中包含前一分数段人数)
* 条件:zf >= fsd.f1
程序代码:
CLOSE DATABASES 
SELECT MIN(zf), MAX(zf) FROM zcj INTO ARRAY acj
ndf = acj[1, 1]
ngf = acj[1, 2]
nfsd = 10
nzds = CEILING(ngf / nfsd)
IF nzds > 254
    RETURN 
ENDIF 
* 创建分数段表
CREATE CURSOR fsd (f1 n(4), f2 n(4))
FOR lnj = 1 TO nzds
    INSERT INTO fsd VALUES ((lnj - 1) * nfsd , lnj * nfsd)
ENDFOR
SELECT * FROM fsd WHERE f1 > ndf - nfsd ORDER BY f1 DESC INTO CURSOR fsd
* 创建字段列表
lcStr = "czxx c(50), 人数 n(4)"
SCAN 
    lcStr = lcStr + ", ≥F" + PADL(f1, 3, "0") + " n(4)"
ENDSCAN 
CREATE CURSOR tjb (&lcStr)
INSERT INTO tjb (czxx, 人数) SELECT czxx, COUNT(*) FROM zcj group by 1
INDEX on czxx TAG name
SELECT czxx, "≥F" + TRANSFORM(fsd.f1) cfsd, COUNT(*) rs FROM zcj, fsd GROUP BY 1, 2 WHERE zf >= fsd.f1 INTO CURSOR cx
SET RELATION TO czxx INTO tjb
SCAN 
    REPLACE (cx.cfsd) WITH cx.rs IN tjb
ENDSCAN
SET RELATION TO 
SELECT tjb
SET ORDER TO 
GO TOP 
BROWSE 


[此贴子已经被作者于2020-8-30 16:15编辑过]


坚守VFP最后的阵地
2020-08-30 10:55
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
以下是引用chychychy在2020-8-30 10:51:48的发言:

谢谢,我之前漏了逗号,后来是中文逗号,怪不得错误。另请教创建统计表tjb1一包含前一分数段代码,之前读过你的其他帖子,主要是命令太复杂,很多我没学过看不懂,请用简单prg指教。

看不懂不要紧,查VFP帮助文件

坚守VFP最后的阵地
2020-08-30 11:19
chychychy
Rank: 2
等 级:论坛游民
帖 子:126
专家分:18
注 册:2015-4-18
得分:0 
回复 4楼 sdta
我将SELECT * FROM fsd WHERE f1 > ndf - nfsd ORDER BY f1 DESC INTO table fsd和CREATE table tjb (&lcStr)中的CURSOR替换后
1.运行REPLACE (cx.cfsd) WITH cx.rs IN tjb
提示找不到变量“≥F0”
测试不包含时
2.运行 lcStr = lcStr + ", ≥F" + PADL(f1, 3, "0") + " n(4)"
提示缺少操作数
3.关于包含不包含我表达的不够清楚,我是想这样:
包含:意思比如实验中学F400(》=400分)统计出有23人,F390(》=390分)有66人,66是包含23的;
不包含:比如实验中学F400(》=400分)统计出有23人,F390(》=390分<400)有43人,43人不包含上一分数段的23人
2020-08-30 15:14
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
回复 6楼 chychychy
4楼代码已更新
看懂代码的思路后再做修改
别整那些没用的DBF表

[此贴子已经被作者于2020-8-30 18:31编辑过]


坚守VFP最后的阵地
2020-08-30 16:04
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:10 
* VFP9代码_分段方式(后一分数段人数中不包含前一分数段人数)
* 条件:zf >= fsd.f1 AND zf < fsd.f2
程序代码:
CLOSE DATABASES 
SELECT MIN(zf), MAX(zf) FROM zcj INTO ARRAY acj
ndf = acj[1, 1]
ngf = acj[1, 2]
nfsd = 10
nzds = CEILING(ngf / nfsd)
IF nzds > 254
    RETURN 
ENDIF 
* 创建分数段表
CREATE CURSOR fsd (f1 n(4), f2 n(4))
FOR lnj = 1 TO nzds
    INSERT INTO fsd VALUES ((lnj - 1) * nfsd , lnj * nfsd)
ENDFOR
SELECT * FROM fsd WHERE f1 > ndf - nfsd ORDER BY f1 DESC INTO CURSOR fsd
* 创建字段列表
lcStr = "czxx c(50), 人数 n(4)"
SCAN 
    lcStr = lcStr + ", ≥F" + PADL(f1, 3, "0") + " n(4)"
ENDSCAN 
CREATE CURSOR tjb (&lcStr)
INSERT INTO tjb (czxx, 人数) SELECT czxx, COUNT(*) FROM zcj group by 1
INDEX on czxx TAG name
SELECT czxx, "≥F" + TRANSFORM(fsd.f1) cfsd, COUNT(*) rs FROM zcj, fsd GROUP BY 1, 2 WHERE zf >= fsd.f1 AND zf < fsd.f2 INTO CURSOR cx
SET RELATION TO czxx INTO tjb
SCAN 
    REPLACE (cx.cfsd) WITH cx.rs IN tjb
ENDSCAN
SET RELATION TO 
SELECT tjb
SET ORDER TO 
GO TOP 
BROWSE 

坚守VFP最后的阵地
2020-08-30 16:13
chychychy
Rank: 2
等 级:论坛游民
帖 子:126
专家分:18
注 册:2015-4-18
得分:0 
回复 8楼 sdta
太谢谢了,学习了!
2020-08-30 17:00
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:0 
程序代码:
SET ENGINEBEHAVIOR 70
SET SAFETY OFF 
SET TALK OFF 

CLOSE DATABASES 
SELECT 0
USE fsd ALIAS fsd
SELECT 0
USE zcj ALIAS bmk
SELECT fsd
zdgt="( czxxdm c(10),czxx c(30),zrs n(5),"
SCAN
  zdgt=zdgt+fnam+" n(4),"
  SELECT fsd
ENDSCAN 
bjg=STUFF(zdgt,RAT(",",zdgt),1,")")  
CREATE TABLE xxk  &bjg.
SELECT czxxdm,czxx,coun(*) as zrs FROM bmk GROUP BY czxxdm INTO CURSOR tmpls
SELECT xxk
APPEND FROM DBF("tmpls")
*-----
SELECT fsd
GO top
SCAN
  _sxf=fsd.f2
  _xxf=fsd.f1
  _zdm=fsd.fnam
  SELECT xxk
  Go top
  SCAN
    _xxdm=xxk.czxxdm
    SELECT bmk
    COUNT TO sn FOR bmk.czxxdm=_xxdm AND bmk.zf>=_xxf AND bmk.zf<_sxf    
    SELECT xxk
    REPLACE (_zdm) WITH sn
  ENDSCAN 
  SELECT fsd
ENDSCAN 
SELECT xxk
BROWSE


[此贴子已经被作者于2020-8-31 17:00编辑过]


只求每天有一丁点儿的进步就可以了
2020-08-31 16:53



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




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

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