主题:不拆分表,如何实现班内序号的填写
ihorse
[专家分:970] 发布于 2009-08-06 16:24:00
一个表,包含全年级学生的成绩,也有相应的班级编号,如果先按班级编号将各班的学生取出来再排序,然后填写班内序号,虽然可行,但是比较麻烦。
有没有办法不提取出各班学生,让所有学生都在这个表中,但是要按该学生在这个班的成绩排序好,且填写他在这个班内的序号?
附:表的字段及部分记录如下:
班次 姓名 性别 编班成绩 班内序号
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个回复)
沙发
Vii [专家分:1130] 发布于 2009-08-06 19:52:00
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
--可以这样试试
板凳
ihorse [专家分:970] 发布于 2009-08-06 21:09:00
我这个可是一个表,没有什么A,B表等啊!
3 楼
Vii [专家分:1130] 发布于 2009-08-06 23:05:00
看清楚哦,这是同个表自连接而已啊.
你可以试下嘛.
毛主席说过没有什么就没有什么.
4 楼
sywzs [专家分:5650] 发布于 2009-08-07 06:37:00
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 楼
yjr3032570 [专家分:3360] 发布于 2009-08-07 08:32:00
一句SQL语句是搞不定同时按班级和名次排序的!
a.cj<=b.cj 在同分的情况下就会产生歧义,这时就需要楼主来确定如何排这个先决条件,再来写代码了!
6 楼
Ilikefox [专家分:5770] 发布于 2009-08-07 11:18:00
便于说明,先给出跟帖字段名的对应
班次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 楼
Vii [专家分:1130] 发布于 2009-08-07 15:58:00
a.cj<b.cj 查询结果是 48行数据
a.cj<=b.cj 查询结果是 54行数据
a.cj<b.cj 分数取整情况下.
1 陈小云
1 谢婷婷
2 张敏杰
3 张娇玲
4 王文龙
5 王江涛
就没有了.
8 楼
yjr3032570 [专家分:3360] 发布于 2009-08-07 16:47:00
当取:.cj<b.cj 忽略了真正的第一名
5个班级少了5名
当取:.cj<=b.cj 时排序有了问题
同名均会往后排
望楼上两位高手能有解决办法,本论坛还有一位顶尖高手CBL518,不知能否看到本题。
9 楼
ihorse [专家分:970] 发布于 2009-08-07 17:01:00
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 楼
Ilikefox [专家分:5770] 发布于 2009-08-07 17:04:00
呵呵,抱歉抱歉,疏忽了。查看了中间集合,当取<时,漏掉了某同学自己和自己组合的记录,应该加上漏掉的这个。
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
我来回复