当前位置:主页>销售管理软件> 列表

学生考试科目名次的SQL语句实现

仓库管理软件版1楼: 我用动态生成的办法生成了一个SQL语句串@StrSql(很长、很复杂),然后用
EXEC(@StrSql)
查询出一个表(在存储过程中),得出如下结果集,存放在全局临时表里(存不了局部临时表):

t1
-------------------------------------------------------------
XH KCID 语文 数学 英语 总分
200501 1 85.0 95.0 90.0 270
200501 2 90.0 95.0 95.0 280
200501 3 85.0 95.0 95.0 275
200502 1 60.0 75.0 70.0 205
200502 2 70.0 75.0 75.0 220
200502 3 85.0 85.0 95.0 265

然后我想在这个结果集t1的基础上得出每次考试各科(包括总分,用百分比表示,相同分数的排名相同)的名次,例如要返回如下结果集:

t2
---------------------------------------------------------------
XH KCID 语文 数学 英语 总分
200501 1 100 100 100 100
200501 2 100 100 100 100
200501 3 100 100 100 100
200502 1 50 50 50 50
200502 2 50 50 50 50
200502 3 100 50 100 50

其中:XH:学生学号,
KCID:考次ID,表示某一次考试,相同KCID不同学号的,说明是同一次考试不同学生的成绩或者排名

对于t2:
计算名次的方法类似如下:
某次考试某科的成绩<=某个学生该次考试该科目的成绩 的人数 divide 学生所在班级总人数
比如说:
200501 1 85.0 95.0 90.0 270
这条记录(第一条)
应该从
200501 1 85.0 95.0 90.0 270
200502 1 50 50 50 50
中比较,班级人数是2,由于在 ‘1’的考试中,语文成绩 <= 200501学生的人数为2,所以200501号学生的语文成绩排名是 2/2 * 100.0%=100.0%(而200502号的是50.0%),同理,数学的是100%, 英语的也是100%...如此等等...

计算排名的方法不一定要这样处理,只要实现类似功能即可

请问各位大虾,这个问题该如何处理?
PS:这些语句都是在一个存储过程里实现

2楼: 各位兄弟,我也急需解决此类问题 如管家婆库存管理软件

3楼: 没人能给点意见?555~~~

4楼: 哇塞,我的问题在这里晒了N天了,都没人理,555~~~

5楼: 先对同一考次的学生按某一成绩排序(select * from t1 where KCID = 1 Order By ''语文'' DESC) 然后对所取到的记录用for循环更新t2
first
mingci := 1;
frontScore := fields.fieldByName(''语文'').value;
for i := 1 to dataset.recordcount do
begin
if fields.fieldByName(''语文'').value <> frontScore then
begin
mingci := mingci+1;
frontScore := fields.fieldByName(''语文'').value;
end;
(更新t2表)
next;
end;

我只是说说大体意思,程序可能不对

6楼: select a.xh,a.kcid,((select count(kcid) from table1 where kcid=a.kcid and
數學group by kcid)) as 數學 from table1 a
沒驗証﹐你試一下行不行﹐思路應是這樣的。其它你自己加上去就行了。

仓库管理软件版7楼: To wanshi131:
我想把上面的工作都放在一个存储过程里面做的,所以你的那种方法不太行,不过还是感谢你的帮助。

To hhmyz:
你的代码执行结果如下:
---------------------------------
xh kcid 数学
------ ---- ----
200501 1 0
200501 2 0
200501 3 0
200502 1 NULL
200502 2 NULL


200502 3 NULL
[6rows]

结果有问题,不过一次能得出所有考试的排名这种思路就是我想要的。。。

8楼: 改成这样就行了:
select a.xh,a.kcid,((select count(kcid)
from t1
where kcid=a.kcid and
数学<=a.数学 group by kcid)* 100.0
/
(select count(kcid)
from t1
where kcid=a.kcid
group by kcid)) as 数学
from t1 a
执行结果:
---------------------------------
xh kcid 数学
------ ---- ----
200501 1 100.000000000000
200501 2 100.000000000000
200501 3 100.000000000000
200502 1 50.000000000000
200502 2 50.000000000000
200502 3 50.000000000000
[6rows]

呵呵,谢谢hhmyz,等我把问题完全解决了,再给分你,^_^

9楼: 终于解决该问题,可以结贴啦,^_^



上一篇:SendBuffer发送一个流时出错误   下一篇:没有了