如我有记录
成绩表
学生    分数   名次
小张    100    0
小王    60     0
小李    70     0
...    ... 
...    ...
小黄    81     0
----------------------
如有以上数据
然后我要按分数更新名次
也就是名次为
Select * from 成绩表 order by 分类 desc写1条SQL怎么来更新上面的表谢谢

解决方案 »

  1.   

    2005
    update 成绩表 set
     名次 = row_number() over (order by 分类 desc)
      

  2.   

    2kupdate a set
     名次 = (select count(*) from 成绩表  where 分数<= a.分数)
    from 成绩表 a1楼分类-->分数
      

  3.   

    --如果学生名是唯一的:
    ;with cte as(
    select rank()over(order by 分数 desc)rk,* from 成绩表
    )update t set 名次=r.rk from 成绩表 t inner join cte r on t.学生=k.学生
      

  4.   

    我是2005的SQL
    如果
    update 成绩表 set
     名次 = row_number() over (order by 分类 desc)
    --------
    这里要求如果当row_number大于指定数据的时候要+1怎么办
    也就是说
    小张 100 0
    小黄 81 0
    小李 70 0
    小王 60 0
    如上面更新就为
    小张 100 1
    小黄 81 2
    小李 70 3
    小王 60 4
    但现在我要更新为,如果名次大于或等于2的话得加了结果为
    小张 100 1
    小黄 81 3
    小李 70 4
    小王 60 5那SQL要怎么写谢谢
      

  5.   

    create table 成绩表(姓名 varchar(10),分数 int,名次 int)
    insert into 成绩表 select '小张',100, 0
    insert into 成绩表 select '小黄',81, 0
    insert into 成绩表 select '小李',70, 0
    insert into 成绩表 select '小王',60, 0
    go
    ;with cte as(
    select rank()over(order by 分数 desc)rk,* from 成绩表
    )update t set 名次=r.rk from 成绩表 t inner join cte r on t.姓名=r.姓名
    select * from 成绩表
    /*
    姓名         分数          名次
    ---------- ----------- -----------
    小张         100         1
    小黄         81          2
    小李         70          3
    小王         60          4(4 行受影响)
    */
    ;with cte as(
    select rank()over(order by 分数 desc)rk,* from 成绩表
    )update t set 名次=(case when r.rk>1 then r.rk+1 else r.rk end) from 成绩表 t inner join cte r on t.姓名=r.姓名
    select * from 成绩表
    /*
    姓名         分数          名次
    ---------- ----------- -----------
    小张         100         1
    小黄         81          3
    小李         70          4
    小王         60          5(4 行受影响)*/
    go
    drop table 成绩表
      

  6.   


    create table #t(name varchar(50),result int, num int)
    insert into #t
    select '小张' as name,100 as reslut,0 as num union all
    select '小王',60,0 union all
    select '小李',70,0update a
    set num = (select count(1) from #t where result >= a.result)
    from #t aselect * from #t order by num
    drop table #t
    ------------------------------------------------------
    name                                               result      num
    -------------------------------------------------- ----------- -----------
    小张                                                 100         1
    小李                                                 70          2
    小王                                                 60          3(3 行受影响)
      

  7.   

    ---2000
    select * into #tb from (select 学生,分数,名次 = (select count(1) from 成绩表  where 分数<= a.分数))tte t set 名次=(case when b.名次>1 then b.名次+1 else b.名次 end) from 成绩表 a join #t b on a.姓名=b.姓名
      

  8.   


    --掉了几个字母
    select * into #tb from (select 学生,分数,名次 = (select count(1) from 成绩表  where 分数<= a.分数))tupdate a set 名次=(case when b.名次>1 then b.名次+1 else b.名次 end) from 成绩表 a join #t b on a.姓名=b.姓名