zoukankan      html  css  js  c++  java
  • 用sql语句写排名

    使用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
  • 相关阅读:
    转:Git: git stash 用法小结
    Checkbox: ListView 与CheckBox 触发事件冲突的问题
    android: getDimension, getDimensionPixelOffset 和getDimensionPixelSize 区别
    java: 保留两位小数4种方法
    java: 保留两位小数4种方法
    转:在eclipse中 使用7.0及以上手机进行测试时logcat不打印日志的解决办法
    转:Android文件存储路径getFilesDir()与getExternalFilesDir的区别
    Gradle-修改.gradle默认目录
    Windows: 打开关闭网络连接的方法
    dom4j: 生成XML时文本中回车换行无效
  • 原文地址:https://www.cnblogs.com/101key/p/3847649.html
Copyright © 2011-2022 走看看