101key

使用SQL语句求排名

表jh03有下列数据:
name score
aa  99
bb  56
cc  56
dd  77
ee  78
ff  76
gg  78
ff  50
1. 名次生成方式1 , Score重复时合并名次
SELECT * , Place=(SELECT COUNT(DISTINCT Score) FROM jh03 WHERE Score >= a.Score)
FROM jh03 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 jh03 WHERE Score > a.Score) + 1
FROM jh03 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
--成绩统计示例(交叉表)
--测试表
create table #t(xh varchar(3),xm varchar(10),km varchar(10),cj int)
insert into #t
select \'001\',\'张三\',\'语文\',80
union all select \'001\',\'张三\',\'数学\',85
union all select \'002\',\'李四\',\'语文\',90
union all select \'002\',\'李四\',\'数学\',80
union all select \'003\',\'王五\',\'语文\',70
union all select \'003\',\'王五\',\'数学\',78

--数据处理
declare @sql nvarchar(4000) , @sql1 nvarchar(4000)
select @sql = \'\' , @sql1 = \'\'
select @sql = @sql + \',[\' + km + \'] = sum(case km when \'\'\' + km + \'\'\' then cj else 0 end)\'
,@sql1 = @sql1 + \',[\' + km + \'名次]=(select sum(1) from # where [\' + km +\'] >= a.[\' + km + \'])\'
from(select distinct km from #t) a
exec(\'select xh 学号,xm 姓名\'+@sql+\',总成绩=sum(cj)
,总名次=(select sum(1) from(select xh,aa=sum(cj) from #t group by xh) aa where sum(a.cj)<=aa)
into # from #t a group by xh,xm
select *\'+@sql1+\' from # a
\')

drop table #t

/*--测试结果

学号 姓名 数学 语文 总成绩 总名次 数学名次 语文名次
---- ------ ------- -------- ----------- ----------- ----------- -----------
002 李四 80 90 170 1 2 1
003 王五 78 70 148 3 3 3
001 张三 85 80 165 2 1 2

--*/

 

其他参考写法mysql:

SELECT
    obj_new.id,
    obj_new.score,
    obj_new.rownum
FROM (
        SELECT
            obj.id,
            obj.score,
            @rownum := @rownum + 1 AS num_tmp,
            @incrnum := CASE
        WHEN @rowtotal = obj.score THEN
            @incrnum
        WHEN @rowtotal := obj.score THEN
            @rownum
        WHEN @rowtotal = 0 THEN
                  @rownum :=@rownum
        END AS rownum
        FROM
            (
                SELECT
                    id,
                    score
                FROM
                    sslm_college_simulation
                ORDER BY
                    score DESC
            ) AS obj,
            (
                SELECT
                    @rownum := 0 ,@rowtotal := NULL ,@incrnum := 0
            ) r
) AS obj_new

 

分类:

技术点:

相关文章:

  • 2022-02-07
  • 2022-02-10
  • 2022-12-23
  • 2021-09-03
  • 2021-12-22
  • 2022-12-23
  • 2021-11-26
猜你喜欢
  • 2021-08-26
  • 2022-12-23
  • 2022-12-23
  • 2021-12-31
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案