精通数据库的进来----在线等急(我不相信CSDN没有高手)

softfwind 2006-02-16 09:03:34
有一张成绩表(course),只有两个字段,姓名(name)和成绩(score)。怎样用
一个SQL语句查询出某个学生的姓名,成绩以及在成绩表中的排名?
表结构如下:
表名:Course
姓名字段:name
成绩字段:score
...全文
241 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
rouqu 2006-02-19
  • 打赏
  • 举报
回复
create table tb1 (
[name] varchar(20) not null,
score smallint not null
)

insert into tb1 values ('David',99)
insert into tb1 values ('Alex',33)
insert into tb1 values ('Scott',88)
insert into tb1 values ('Henry',13)
insert into tb1 values ('Edwards',96)
insert into tb1 values ('Robin',89)
insert into tb1 values ('Jones',85)
insert into tb1 values ('Lancy',71)

select *,identity(int,1,1) seq into #tb1 from tb1 order by score desc
select * from #tb1

是你要的结果不?(PS:这不是很难的问题吧)

rouqu 2006-02-17
  • 打赏
  • 举报
回复
如果你的表结构类似
-------
name score
David 99
Scott 88
Alan 96
Joe 85
....

select *,identity(int,1,1) seq into #tb1 from course order by score desc
select * from #tb1 where name = ''


-狙击手- 2006-02-17
  • 打赏
  • 举报
回复
------排名连续且不重复

CREATE TABLE tb(Name varchar(10),Score decimal(10,2))
INSERT tb SELECT 'aa',99
UNION ALL SELECT 'bb',56
UNION ALL SELECT 'cc',56
UNION ALL SELECT 'dd',77
UNION ALL SELECT 'ee',78
UNION ALL SELECT 'ff',76
UNION ALL SELECT 'gg',78
UNION ALL SELECT 'ff',50
GO


select idrow= identity(int,1,1) ,* into # from tb order by score desc,name
select name,Score ,
( select count(*) from # where idrow < a.idrow ) + 1 as plcace
from # a

drop table tb,#

/*

name Score plcace
---------- ------------ -----------
aa 99.00 1
ee 78.00 2
gg 78.00 3
dd 77.00 4
ff 76.00 5
bb 56.00 6
cc 56.00 7
ff 50.00 8

(所影响的行数为 8 行)
*/
zlp321002 2006-02-17
  • 打赏
  • 举报
回复
--邹建书上例子:

--示例数据
CREATE TABLE tb(Name varchar(10),Score decimal(10,2))
INSERT tb SELECT 'aa',99
UNION ALL SELECT 'bb',56
UNION ALL SELECT 'cc',56
UNION ALL SELECT 'dd',77
UNION ALL SELECT 'ee',78
UNION ALL SELECT 'ff',76
UNION ALL SELECT 'gg',78
UNION ALL SELECT 'ff',50
GO

--1. 名次生成方式1,Score重复时合并名次
SELECT *,Place=(SELECT COUNT(DISTINCT Score) FROM tb WHERE Score>=a.Score)
FROM tb a
ORDER BY Place
/*--结果
Name Score Place
---------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 3
ff 76.00 4
bb 56.00 5
cc 56.00 5
ff 50.00 6
--*/



--2. 名次生成方式2,Score重复时保留名次空缺
SELECT *,Place=(SELECT COUNT(Score) FROM tb WHERE Score>a.Score)+1
FROM tb a
ORDER BY Place
/*--结果
Name Score Place
--------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 4
ff 76.00 5
bb 56.00 6
cc 56.00 6
ff 50.00 8
--*/
lcooc 2006-02-17
  • 打赏
  • 举报
回复
高手啊,收了
caiyunxia 2006-02-16
  • 打赏
  • 举报
回复
declare @Course table(name varchar(10),score dec(10,2))

insert @Course select 'a1',91
insert @Course select 'a2',90
insert @Course select 'a3',89
insert @Course select 'a4',89
insert @Course select 'a7',89
insert @Course select 'a5',89
insert @Course select 'a6',88


select name,score,(select count( score) from @Course where score>a.score and a.name<>name)+1 as 排名
from @Course a
a1 91.00 1
a2 90.00 2
a3 89.00 3
a4 89.00 3
a7 89.00 3
a5 89.00 3
a6 88.00 7
点点星灯 2006-02-16
  • 打赏
  • 举报
回复
还有

1.把某个字段重新生气序列(从1到n):
DECLARE @i int
Set @i = 0
Update Table1 Set @i = @i + 1,Field1 = @i

2.按成绩排名次
Update 成绩表
Set a.名次 = (
Select Count(*) + 1
From 成绩表 b
Where a.总成绩 < b.总成绩
)
From 成绩表 a



排名

我有一个成绩表,想生成一张新表,新表按总成绩排序,新增一列为名次。要求总成绩相同的名次相同。请问如何写SQL语句,要求语句效率高。比如表中数据如下:
xuehao xingming zongfen
0010 lixue 500
0015 zhansi 456
0014 heyao 512
0016 woshi 423
此表xuehao值唯一,希望生成新表如下:
mingci xuehao xingming zongfen
1 0014 heyao 512
2 0010 lixue 500
3 0015 zhansi 456
4 0016 woshi 423

请高手指教!
---------------------------------------------------------------

insert 新表
select 1+isnull((select count(*) from 成绩表 where zongfen>a.zongfen),0) as mingci,xuehao,xingming,zongfen from 成绩表 a order by zongfen desc

---------------------------------------------------------------

select 1+isnull((select count(*) from 成绩表 where zongfen>a.zongfen),0) as mingci,xuehao,xingming,zongfen
into 新表
from 成绩表 a order by zongfen desc

点点星灯 2006-02-16
  • 打赏
  • 举报
回复
有数据如下:表 t_1
(c_1, c_2, c_3)
A, A1, 21
A, B1, 20
B, A1, 3
B, B1, 4
B, C1, 2
C, D1, 10
我要得到的结果如下:
C_1, 排名 , C_2, C_3
A, 1, A1, 21
A, 2, B1, 20

B, 1, B1, 4
B, 2, A1, 3
B, 3, C1, 2

C, 1, D1, 10
以字段C_1分组,以C_3排序(降序),对每组分别进行排名,要显示出排名(1,2,1,2,3,1..)
能否不用循环去做
谢谢


declare @tab table(c_1 varchar(20),c_2 varchar(20), c_3 int)

insert @tab values('A','A1',21)
insert @tab values('A','B1',20)
insert @tab values('B','A1',3)
insert @tab values('B','B1',4)
insert @tab values('B','C1',2)
insert @tab values('C','D1',10)


select a.c_1,[排名]=(select count(1) from @tab where c_1=a.c_1 and a.c_3<=c_3),a.c_2,a.c_3
from @tab a order by c_1,c_3


参考,分组排名

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧