| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4217 人关注过本帖, 2 人收藏
标题:成绩排名 程序优化
只看楼主 加入收藏
ibmlang_002
Rank: 5Rank: 5
来 自:浙江-嘉兴
等 级:贵宾
威 望:18
帖 子:437
专家分:176
注 册:2008-8-30
收藏
得分:0 
修改后的帖子:



有朋友问我,回个贴子:

假定第一列为学号,接下来的是科目和总分,代码如下(较多的使用了宏变换,效率会有影响,但代码是通用的):
IF !USED("cj")
   USE cj IN 0
ENDIF

SELECT cj

FOR nFieldNumber=4 TO FCOUNT("cj")
   cField=FIELD(nFieldNumber,"cj")
   SELECT bj,&cField ,coun(*) as co FROM cj GROUP BY &cField ORDER BY &cField DESC INTO TABLE temp
   pm=cField+"排名"
   ALTER TABLE temp ADD COLUMN &pm n(4)
   a=0
   b=1
   FOR i=1 TO RECCOUNT()
      REPLACE &pm WITH a+b
        a=co
        b=&pm
      SKIP
   ENDFOR
   

IF nFieldNumber=4
  SELECT cj.bj,cj.zkzh,cj.xm,cj.&cField,temp.&pm FROM cj,temp WHERE cj.&cField =temp.&cField ORDER BY cj.&cField DESC into CURSOR  temp20
    ELSE
  SELECT cj.bj,cj.zkzh,cj.xm,cj.&cField,temp.&pm FROM cj,temp WHERE cj.&cField =temp.&cField ORDER BY cj.&cField DESC into CURSOR  temp21
    IF (nFieldNumber/2)<>INT(nFieldNumber/2)
         SELECT temp20.*,temp21.&cField,temp21.&pm from temp20,temp21 WHERE ALLTRIM(temp20.zkzh)==ALLTRIM(temp21.zkzh) ORDER BY temp20.bj INTO CURSOR temp22
    ELSE
         SELECT temp22.*,temp21.&cField,temp21.&pm from temp22,temp21 WHERE ALLTRIM(temp22.zkzh)==ALLTRIM(temp21.zkzh) ORDER BY temp22.bj INTO CURSOR temp20
    ENDIF
   
  ENDIF

ENDFOR

  IF  ((FCOUNT("cj"))/2)<>int((FCOUNT("cj"))/2)
     SELECT temp22
       ELSE
     SELECT temp20
  ENDIF
   
   
   
   
    COPY TO 排名表
   
    CLOSE ALL

[[it] 本帖最后由 ibmlang_002 于 2008-9-19 14:18 编辑 [/it]]

VFP
2008-09-18 13:26
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
002 对select语句比较中意啊,哈哈
我不怎么擅长,学习
2008-09-18 13:32
ibmlang_002
Rank: 5Rank: 5
来 自:浙江-嘉兴
等 级:贵宾
威 望:18
帖 子:437
专家分:176
注 册:2008-8-30
收藏
得分:0 
对,我喜欢

VFP
2008-09-18 13:49
沈三爷
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-7-17
收藏
得分:0 
回复 10楼 szy345
给一个成绩表排名,相当于execl的中函数rank(),经运行,没有问题~!

&&***********&&给一个成绩表排名,相当于execl的中函数rank()
n=0      && 定义一个变量,赋值为0
cjbak=1000   && 定义一个变量,赋值为不等第一条记录的字段"zf"的任意值

USE cjzf      &&打开表
INDEX ON zf to zf   &&定义字段"ZF"为索引标识
SET ORDER TO zf DESCENDING   &&定义按字段"ZF"降序排列打开的表
GO TOP                        &&指针到顶      
FOR i=1 to RECCOUNT()       &&开始循环
 
    IF zf=cjbak          &&判断本条记录的字段"ZF"是否等于变量cjbak
    REPLACE mc WITH n      &&相等则改写字段"mc"为n
    ELSE
     REPLACE mc WITH i      &&不相等,则用变量"i"改写字段"mc"
     ENDIF
    cjbak=zf    &&将本条记录的字段"ZF"的值赋给变量cjbak
     n=mc     &&将本条记录的字段"mc"的值赋给变量n
    SKIP        && 指针下移一行
ENDFOR      && 结束循环
GO TOP       &&指针到顶,方便浏览
BROWSE
RETURN
2011-08-02 20:14
afeng58688
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-11-30
收藏
得分:0 
学习之中
2011-12-01 08:53
快速回复:成绩排名 程序优化
数据加载中...
 
   



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

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