ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » MS SQL Server » 请教!对学生成绩进行排名!

标题: [原创] 请教!对学生成绩进行排名!
离线 laizi0325



精华贴数 0
个人空间 0
技术积分 10 (96491)
社区积分 0 (1857609)
注册日期 2008-9-3
论坛徽章:0
      
      

发表于 2008-9-3 12:41 
请教!对学生成绩进行排名!

现有一学生原始成绩表,大概有几万条记录,格式如下:
name           score
-----------------------
张三              200
李四              300
王五              300
赵六              400
......              ......


想得到以下处理结果

name           score             名次
--------------------------------------
赵六              400                  1
李四              300                  2
王五              300                  2
张三              200                  4
......              ......                ......

要求如有两个并列第二名,则没有第三名,依此类推!!

望高手指点,谢谢!


只看该作者    顶部
离线 laizi0325



精华贴数 0
个人空间 0
技术积分 10 (96491)
社区积分 0 (1857609)
注册日期 2008-9-3
论坛徽章:0
      
      

发表于 2008-9-3 13:33 
各位高手都在睡午觉啦!!!
呵呵 自己先顶一下!


只看该作者    顶部
离线 larrywall
初级会员



精华贴数 0
个人空间 0
技术积分 80 (19925)
社区积分 0 (537897)
注册日期 2005-7-29
论坛徽章:0
      
      

发表于 2008-9-3 14:43 
如果你使用的是SQL SERVER 2005, 可以这样解决

SELECT  
    name ,
   score,
   RANK() OVER(ORDER BY score) AS '名次'
FROM table_name
ORDER BY 名次


只看该作者    顶部
离线 zdpingly


来自 广州
精华贴数 0
个人空间 0
技术积分 50 (28572)
社区积分 0 (1853819)
注册日期 2008-8-28
论坛徽章:0
      
      

发表于 2008-9-3 15:47 
select a1.[name], a1.score, count(a2.score) scorerank
from testtable_mark a1, testtable_mark a2
where a1.score <= a2.score or (a1.score=a2.score and a1.[name] = a2.[name])
group by a1.[name], a1.score
order by  a1.score desc


只看该作者    顶部
离线 zdpingly


来自 广州
精华贴数 0
个人空间 0
技术积分 50 (28572)
社区积分 0 (1853819)
注册日期 2008-8-28
论坛徽章:0
      
      

发表于 2008-9-3 16:20 
我上面写的有错,在2000里,这样写,只要你的表名,列名改回你的,就可以直接用的。
declare @tname varchar(50),@x int,@y int,@tscore float,@tming int,@z int,@m int
declare @tname1 varchar(50),@tscore1 float,@tming1 int,@tname2 varchar(50),@tscore2 float,@tming2 int
set @x=1
set @z=1
select @y=count(*) from dbo.testtable_mark

DECLARE authors_cursor SCROLL CURSOR FOR
SELECT * FROM  dbo.testtable_mark
ORDER BY score desc
OPEN authors_cursor

while @x<=@y
begin
FETCH ABSOLUTE @x  FROM authors_cursor
into @tname,@tscore,@tming

update dbo.testtable_mark
set 名次=@x
where [name]=@tname

set @x=@x+1
set @tname=''
end

while @z<=@y
begin
set @m=@z+1
FETCH ABSOLUTE @z  FROM authors_cursor
into @tname1,@tscore1,@tming1

FETCH ABSOLUTE @m  FROM authors_cursor
into @tname2,@tscore2,@tming2

if @tscore1=@tscore2

update dbo.testtable_mark
set 名次=@tming1
where [name]=@tname2

set @z=@z+1
end


CLOSE authors_cursor
DEALLOCATE authors_cursor
GO


只看该作者    顶部
离线 yunxufriend
云旭


精华贴数 0
个人空间 0
技术积分 286 (7192)
社区积分 15 (9013)
注册日期 2007-8-30
论坛徽章:8
授权会员2008北京奥运纪念徽章:游泳生肖徽章2007版:兔生肖徽章2007版:鼠生肖徽章2007版:猴生肖徽章2007版:牛
生肖徽章2007版:鸡生肖徽章2007版:虎    

发表于 2008-9-4 16:33 
支持2楼的,有简单又实用。


__________________
天生我才必有用!!!
EMAIL:tuxufriend@163.com
只看该作者    顶部
离线 yunxufriend
云旭


精华贴数 0
个人空间 0
技术积分 286 (7192)
社区积分 15 (9013)
注册日期 2007-8-30
论坛徽章:8
授权会员2008北京奥运纪念徽章:游泳生肖徽章2007版:兔生肖徽章2007版:鼠生肖徽章2007版:猴生肖徽章2007版:牛
生肖徽章2007版:鸡生肖徽章2007版:虎    

发表于 2008-9-4 16:34 
不好意思,是 3楼的弟兄


__________________
天生我才必有用!!!
EMAIL:tuxufriend@163.com
只看该作者    顶部
离线 kajaje
中级会员



精华贴数 0
个人空间 0
技术积分 488 (4054)
社区积分 0 (230206)
注册日期 2004-12-16
论坛徽章:1
授权会员     
      

发表于 2008-9-4 19:37 
其实不用这么麻烦~~~distinct score这个字段,然后排序,建立identity字段,再把结果集和原来的表做内连接就可以了~~不过要建立临时表~~


只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问