回 帖 发 新 帖 刷新版面

主题:通过SQL求名次问题

通过SQL求名次问题:T表中有字段:学号,分数,时间
学号 分数 时间
01    3    2006-02-01
01    3    2006-02-02
02    7    2006-02-03
02    3    2006-02-04
03    2    2006-02-05
03    4    2006-02-08
我想从T表中查询到并处理后得到的数据是:
学号 总分  排名
01    6    2
02    10   1
03    6    2
请问怎样通过SQL 语气实现这样的功能.能够解决这个问题的马上给分


回复列表 (共10个回复)

沙发

用一张临时表可以,不知对你有没有用????

板凳

先create 一个临时表B 插入学号及对应总分--用sum()搞定总分

SELECT 学号,总分,
(select count(Distinct 总分) from T A where A.总分 >= T.总分 ) as '排名'
from B
order by 排名
就可以了

3 楼

学习

4 楼

楼上的兄弟行不通

5 楼

本人水平有限,做出来的比较复杂:
1. --将分数统计放入一张临时表中,并按降序排序
select distinct sum(分数) as sum1 into #表名1 from 表名 group by [学号] order by sum1 desc

2. --将临时表的分数进行排名显示
select sum1,identity(int,1,1) as 排名 into #表名2 from #表名1

3.
select B.[id],B.sum1,#表名2.排名 from (select [id],sum(num1) as sum1 from 表名 group by [学号]) as B,#表名2
where B.sum1=#表名2.sum1

6 楼

楼上的所以兄弟都弄得很复杂,经过研究实践,一语句SQL搞定
SELECT (SELECT COUNT(0)
FROM T
WHERE score >= a.score) AS 排名, *
FROM T a
ORDER BY 分数 DESC

7 楼

兄弟,我这边怎么没实现啊?能把你的sql语句详讲一下,学习中.你好像没有按学号进行汇总吧

8 楼

--示例数据
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
--*/

9 楼

对不起,我忘汇总了,详细代码如下:

select 学号,sum(分数) AS 总分 into T1 from T
SELECT (SELECT COUNT(0)
FROM T1
WHERE score >= a.score) AS 排名, *
FROM T1 a
ORDER BY 分数 DESC
drop T1

10 楼

这样的语气也可以的哦,看来关于排名的方法还是好多的

select *,(select count (distinct 总分) as 排名
 FROM(selec 学号,sum(分数) as 总分 from T group by 学号 a ) where a.总分>=b.总分 )from (selec 学号,sum(分数) as 总分 from T group by 学号) b order by 排名

我来回复

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