使用SQL语句求排名

本文介绍两种使用SQL实现的成绩排名方法:一种是在分数相同的情况下合并名次;另一种是在分数相同的情况下保留名次空缺。此外,还展示了如何利用SQL进行成绩统计,包括计算总成绩、总名次以及各科目的名次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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   
    
  --
*/
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值