| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2965 人关注过本帖
标题:求助:让考生,按总分进行全县排名和本学校排名,并更新两个排名字段。
只看楼主 加入收藏
wyzeaaa
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2019-6-4
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:10 
求助:让考生,按总分进行全县排名和本学校排名,并更新两个排名字段。
**全县排名
*相同分数占名次(12245668……)
SELECT zf,RECNO() qxpm FROM (SELECT DISTINCT zf FROM zk11222019 ORDER BY zf DESC) A INTO CURSOR T1
UPDATE zk11222019 SET qxpm=(SELECT COUNT(*)+1 FROM zk11222019 t1 WHERE zk11222019.zf<t1.zf)

全县排名,按在咱们论坛上搜索到的帖子,测试了一下可以实现,字段qxpm是全县排名。
学校排名,就不知道如何弄了,各个学校的数据都混在这一个表中,字段xxpm是学校排名。
如何按毕业学校字段(Byxx)分组统计考生在本学校的排名,然后更新到xxpm字段中。
图片附件: 游客没有浏览图片的权限,请 登录注册



附dbf表:

zk11222019.rar (27.33 KB)


[此贴子已经被作者于2019-8-8 16:49编辑过]

搜索更多相关主题的帖子: 总分 排名 学校 更新 字段 
2019-08-08 16:35
schtg
Rank: 12Rank: 12Rank: 12
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1544
专家分:3003
注 册:2012-2-29
收藏
得分:10 
请试一试下面这句,再看结果。
select * from zk11222019 into table _LS
UPDATE _ls SET xxpm=(SELECT COUNT(*)+1 FROM _ls B WHERE _ls.zf<B.zf AND _ls.byxx=B.byxx)
图片附件: 游客没有浏览图片的权限,请 登录注册
2019-08-08 18:46
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9798
专家分:26886
注 册:2012-2-5
收藏
得分:0 
如果楼主是初学VFP,建议还是用VFP自身命令来写代码,如果楼主SQL命令功力深厚,另当别论。如果数据量大(>3W),SQL命令处理数据的速度是比较慢的。

[此贴子已经被作者于2019-8-8 19:47编辑过]


坚守VFP最后的阵地
2019-08-08 19:40
wyzeaaa
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2019-6-4
收藏
得分:0 
回复 2楼 schtg
select * from zk1122 into table _LS
UPDATE _ls SET xxpm=(SELECT COUNT(*)+1 FROM _ls B WHERE _ls.zf<B.zf AND _ls.byxx=B.byxx)

麻烦老师指点一下,这个红色部分,感觉命令中也没有生成这个表,这个在命令中有什么特别含义和作用吗?


一个按钮里加了下面这两行命令,测试了一下,感觉是可以达到全县排名和各自学校排名的目的,运行时感觉有些迟钝(表中有5000条记录),是不是这个代码有什么问题,需要精简一下?

UPDATE zk1122 SET qxpm=(select COUNT(*)+1 from zk1122 as a WHERE a.zf>zk1122.zf)  && 全县名次
UPDATE zk1122 SET xxpm=(select COUNT(*)+1 from zk1122 as a WHERE a.zf>zk1122.zf AND a.byxx=zk1122.byxx)  && 学校名次

这个表a,也不知道是怎么来的,也不知道起什么作用,麻烦知道的老师指点一下。

[此贴子已经被作者于2019-8-12 10:22编辑过]

2019-08-12 09:40
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2197
专家分:3838
注 册:2007-4-27
收藏
得分:10 
看样子,楼主还没解决问题。中考做完了,有时间了 给你一个计算学校内名次的基础算法的事例,算全县的名次更简单

zkcj.rar (20.53 KB)


代码不是最优,但容易理解

只求每天有一丁点儿的进步就可以了
2019-08-12 14:21
wyzeaaa
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2019-6-4
收藏
得分:0 
谢谢,我下来测试一下。
2019-08-12 18:39
schtg
Rank: 12Rank: 12Rank: 12
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1544
专家分:3003
注 册:2012-2-29
收藏
得分:0 
回复 4楼 wyzeaaa
其作用可以简单理解为将原表复制产生一个与原表完全相同的新表,从而达到按照where给定的条件比较两表的总分,得出排名。
其运行速度可能会慢一点,与机器配置有关,按理5000条记录应该不会有太大的时间差吧。

[此贴子已经被作者于2019-8-13 08:58编辑过]

2019-08-13 08:57
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
收藏
得分:0 
回复 楼主 wyzeaaa
表加一个id字段,查询后按id字段更新回去就可以了!

搞错了,有空研究一下

[此贴子已经被作者于2019-8-13 11:11编辑过]

2019-08-13 09:48
wyzeaaa
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2019-6-4
收藏
得分:0 
回复 5楼 wengjl
程序代码:
CLOSE DATABASES 
SELECT 0
USE zkcj  &&打开成绩表zkcj

SELECT * from zkcj orde by byxx,zf desc into cursor temp READWRITE  &&打开成绩表zkcj,按byxx,zf两个字段降序(orde by * descend,的作用是按某个字段降序排列,升序是ascend),排列生成临时表temp(与原表结构完全相同),允许写入。
SELECT temp  &&打开临时表temp
GO TOP   &&到表第一行
cbj=temp.byxx  &&让变量cbj等于临时表byxx字段,这一句作用是什么?
DO whil not EOF() &&作用:只要不到文件尾,就不退出循环
  nmcz=1      && 总名次
  nmcd=1      && 相同名次
  ntot=temp.zf &&让ntot等于临时表总分。不知道怎么理解
  REPLACE temp.xxpm with nmcd  &&替换临时表的学校排名为nmcd
  DO whil not EOF() and temp.byxx=cbj   &&&& 遇到不同校(班)了退出。
    SKIP  &&下移一条记录
    nmcz=nmcz+1  &&总名次+1
    IF temp.zf=ntot   &&不知道怎么理解
      REPLACE temp.xxpm with nmcd  &&替换临时表xxpm为相同名次
    ELSE
      nmcd=nmcz
      REPLACE temp.xxpm with nmcd  &&替换
      ntot=temp.zf
    ENDIF   
  ENDDO
  cbj=temp.byxx &&这一句的作用?
ENDDO         &&& 完成名次的计算
*----
SELECT temp
SCAN
  SELECT zkcj
  LOCATE for zkcj.zkzh ==temp.zkzh        &&&&& 表中加了准考证号(zkzh)是作为唯一标识码使用的
  IF FOUND()
    REPLACE zkcj.xxpm with temp.xxpm
  ENDIF 
  SELECT temp
ENDSCAN       &&& 将计算结果写回到表
RETURN 


cbj=temp.byxx  &&让变量cbj等于临时表byxx字段,这一句作用是什么?
DO whil not EOF() &&作用:只要不到文件尾,就不退出循环
  nmcz=1      && 总名次
  nmcd=1      && 相同名次
  ntot=temp.zf &&让ntot等于临时表总分。不知道怎么理解
  REPLACE temp.xxpm with nmcd  &&替换临时表的学校排名为nmcd
  DO whil not EOF() and temp.byxx=cbj   &&&& 遇到不同校(班)了退出。
    SKIP  &&下移一条记录
    nmcz=nmcz+1  &&总名次+1
    IF temp.zf=ntot   &&不知道怎么理解
      REPLACE temp.xxpm with nmcd  &&替换临时表xxpm为相同名次
    ELSE
      nmcd=nmcz
      REPLACE temp.xxpm with nmcd  &&替换
      ntot=temp.zf
    ENDIF   
  ENDDO
  cbj=temp.byxx &&这一句的作用?
ENDDO         &&& 完成名次的计算


我基础太差了,老师给了代码,我一句一句的研究,也是看不明白,看看哪位老师能给备注一下每一句的作用及含义。
有的备注是我自己加的,也可能不对

[此贴子已经被作者于2019-8-13 11:14编辑过]

2019-08-13 11:08
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2197
专家分:3838
注 册:2007-4-27
收藏
得分:0 
cbj=temp.byxx  &&让变量cbj等于临时表byxx字段,这一句作用是什么? 后面有注释:遇到不同校(班)了退出,开始下一个学校(班),下一个学校了的变量转换就是你的第三问。

IF temp.zf=ntot   &&不知道怎么理解。  下一句就是注释:为了你的同分记同名次

  cbj=temp.byxx &&这一句的作用?    开始新的学校

这些都是变量的值的转换。关键靠你自己悟,悟空了才行

[此贴子已经被作者于2019-8-15 08:37编辑过]


只求每天有一丁点儿的进步就可以了
2019-08-14 13:11
快速回复:求助:让考生,按总分进行全县排名和本学校排名,并更新两个排名字段。
数据加载中...
 
   



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

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