回 帖 发 新 帖 刷新版面

主题:不拆分表,如何实现班内序号的填写

一个表,包含全年级学生的成绩,也有相应的班级编号,如果先按班级编号将各班的学生取出来再排序,然后填写班内序号,虽然可行,但是比较麻烦。
有没有办法不提取出各班学生,让所有学生都在这个表中,但是要按该学生在这个班的成绩排序好,且填写他在这个班内的序号?
附:表的字段及部分记录如下:
班次    姓名    性别    编班成绩    班内序号
1    廖晓真    女    393.8    
1    孙海榕    男    391.1    
1    庄树真    女    393.8    
1    谢婷婷    女    401.3    
1    曾晴晴    女    395.8    
1    陈小云    女    401.5    
    ……        ……(1班其他学生)
2    黄妙玲    女    396
2    余婉婷    女    398
2    张敏杰    男    405.5
2    叶真真    女    393.8
2    王青梅    女    401.6
2    陈婉婷    女    401.1
2    胡荣强    男    401.6
2    陈日亮    男    394.8

    ……        ……(2班其他学生)
3    庄晓云    女    395.5
3    陈特龙    男    395
3    李青兰    女    401
3    黄剑波    男    397.8
3    张娇玲    女    409.6
3    林锦灿    男    394.3
3    许湘湘    女    394
3    庄铭    男    397.3
3    汪小婷    女    406
3    陈蓉蓉    女    405.3
3    江艺彬    男    399.8
3    陈雪萍    女    401.8
3    陈叶基    男    399
3    庄青青    女    408.1
    ……        ……(3班其他学生)

4    许均豪    男    397.8
4    孙钦煌    男    392.3
4    黄冰冰    女    398.5
4    骆巧玲    女    401.8
4    王文龙    男    412.5
4    曾艳芳    女    405.1
4    辛冰冰    女    407.8
4    谢骆佳    女    406.1
4    陈艺芳    女    400.8
4    骆文境    男    399.8
4    黄经杰    男    395.1
4    张雪红    女    385.5
4    张伟群    女    394
4    王燕花    女    395.5
4    杨小强    男    408.6
4    卢伟杰    男    394.3
4    蔡柏    男    402.3
    ……        ……(4班其他学生)

5    郑汉杰    男    402.3
5    王江涛    男    411.1
5    张淑芬    女    405
5    苏银钦    男    399.8
5    苏艺    女    407.8
5    陈堃    男    398
5    骆贤亮    女    393.6
5    王冰冰    女    396.1
5    吴梅燕    女    400.8

    ……        ……(5班其他学生)

回复列表 (共14个回复)

沙发

select a.bh,a.xm,a.cj,sum(1) as xh from stud a,stud b where a.bh=b.bh and a.cj<=b.cj  group by a.bh,a.xm,a.cj order by a.bh,xh

--可以这样试试

板凳

我这个可是一个表,没有什么A,B表等啊!

3 楼

看清楚哦,这是同个表自连接而已啊.
你可以试下嘛.
毛主席说过没有什么就没有什么.

4 楼

1楼的思路很正确,在此学习了,经测试,需在语句中添加两处
select a.bh,a.xm,a.cj,sum(1) as xh from stud a,stud b where a.bh=b.bh and a.cj<=b.cj group by a.bh,a.xm,a.cj[color=0000FF][b],a.xh [/b][/color]order by a.bh,[color=0000FF][b]a.[/b][/color]xh

5 楼

一句SQL语句是搞不定同时按班级和名次排序的!
a.cj<=b.cj 在同分的情况下就会产生歧义,这时就需要楼主来确定如何排这个先决条件,再来写代码了!

6 楼

便于说明,先给出跟帖字段名的对应
班次bh,姓名xm,编班成绩cj,班内序号xh


俺觉得1楼Vii给出的查询不错,呵呵,小小的改一点点:
select a.bh,a.xm,a.cj,sum(1) as xh from stud a,stud b where a.bh=b.bh and a.cj<b.cj  group by a.bh,a.xm,a.cj order by a.bh,4

两处:
1. a.cj<=b.cj 改为 a.cj<b.cj
2. order by a.bh,xh 改为 order by a.bh,4

改第1处的原因:若取<=,则同班两个相同成绩的名次会取后一个,即假如有并列第3名的成绩,则均取名次4。
改第2处的原因:Vii是按原表不存在列名为xh字段的情况下写出的。若原表本来就有xh字段,会产生xh列不唯一错误。改为4,指明采用查询结果集中的第4列(即由sum(1)产生的列)排序,这可以提高容错能力。

当然,若原表班内序号的列名不是xh,则无需改第2处。

4楼sywzs改动的地方有些含糊,至少order by a.bh,xh 改为 order by a.bh,a.xh就含糊,按a.xh排序没什么用,因为原表的xh是空的。

7 楼

a.cj<b.cj 查询结果是 48行数据
a.cj<=b.cj  查询结果是 54行数据 

a.cj<b.cj  分数取整情况下.

1 陈小云
1 谢婷婷

2 张敏杰

3 张娇玲

4 王文龙

5 王江涛

就没有了.

8 楼

当取:.cj<b.cj  忽略了真正的第一名 
5个班级少了5名
当取:.cj<=b.cj 时排序有了问题
同名均会往后排
望楼上两位高手能有解决办法,本论坛还有一位顶尖高手CBL518,不知能否看到本题。

9 楼

CLOSE TABLES
SELECT * FROM 123  ORDER BY   班次,成绩 DESC INTO CURSOR TMP READWRITE
LN_ORDER = 1
LN_班次 = 0
DO WHILE NOT EOF()
    LN_班次 = 班次
    REPLACE 班内序号 WITH LN_ORDER
    LN_ORDER = LN_ORDER + 1
    SKIP
         IF LN_班次 <> 班次
     LN_ORDER = 1
    ENDIF
ENDDO
SELECT TMP
BROWSE


*****下面这段程序则能实现对成绩相同者的并列排名,成绩相同,班内序号并列

Close Tables
Select 100 As New_Id,* From Test_Order Order By 班次,成绩 Desc Into Cursor Tmp Readwrite
ln_Order = 1
ln_班次 = 0
ln_成绩 = 0
Do While Not Eof()
    ln_班次 = 班次
    ln_成绩 = 成绩
    Replace New_Id With ln_Order
    ln_Order = ln_Order + 1
    Skip
    If ln_班次 <> 班次
        ln_Order = 1
    Endif
    If ln_成绩 = 成绩
       ln_Order = ln_Order -1
    Endif
Enddo
Select Tmp
Browse 

(以上是咨询一位资深人士后得到的答案)

10 楼

呵呵,抱歉抱歉,疏忽了。查看了中间集合,当取<时,漏掉了某同学自己和自己组合的记录,应该加上漏掉的这个。

select a.bh,a.xm,a.cj,sum(1) as xh from stud a,stud b where a.bh=b.bh and (a.cj<b.cj or a.xm=b.xm) group by a.bh,a.xm,a.cj  order by a.bh,4

我来回复

您尚未登录,请登录后再回复。点此登录或注册