update t set mingci = (case (c.id+a.num-e.id)%a.num when 0 then a.num else (c.id+a.num-e.id)%a.num end) from
(select dengji,count(*) as num from t group by dengji) as a,--返回该等级的记录数
(select fengshu,id=(select sum(1) from t where fengshu>=b.fengshu)--返回按分数排序的名次 
 from t b) as c,
(select dengji,id=(select sum(1) from t where dengji<=d.dengji) --返回小于该等级的记录总数+该等级的记录数(因为sum空值将被忽略)
from t d) as e
where t.dengji = a.dengji and t.fengshu = c.fengshu and t.dengji = e.dengjiselect * from t(所影响的行数为 10 行)fengshu     dengji     mingci      
----------- ---------- ----------- 
100         A          1
90          A          2
80          A          3
70          B          1
60          B          2
50          B          3
40          C          1
30          C          2
20          C          3
10          C          4(所影响的行数为 10 行)

解决方案 »

  1.   

    不好意思,思维定势,不需要取余。(分数排名)减去(小于该等级的记录数)即可。update t set mingci = (c.id+a.num-e.id) from
    (select dengji,count(*) as num from t group by dengji) as a,--返回该等级的记录数
    (select fengshu,id=(select sum(1) from t where fengshu>=b.fengshu)--返回按分数排序的名次 
     from t b) as c,
    (select dengji,id=(select sum(1) from t where dengji<=d.dengji) --返回小于该等级的记录总数+该等级的记录数(因为sum空值将被忽略,不知道怎样得到零值)
    from t d) as e
    where t.dengji = a.dengji and t.fengshu = c.fengshu and t.dengji = e.dengji
      

  2.   

    update a set mingci=(select count(*) from [table] where dengji=a.dengji and fenshu>=a.fenshu) from [table] a
      

  3.   

    update a set mingci=(select count(*) from 班级成绩表 where dengji=a.dengji and fenshu>=a.fenshu)
    from 班级成绩表 a
      

  4.   

    --即使没有dengji这个字段值,也可以用这样的一条记录求得update a set mingci=(select count(*) from 班级成绩表 where case when fenshu<50 then 1 when fenshu>=80 then 2 else 3 end=case when a.fenshu<50 then 1 when a.fenshu>=80 then 2 else 3 end and fenshu>=a.fenshu)
    from 班级成绩表 a
      

  5.   

    如果有同分数:update a 
    set mingci=1+(
    select count(*) from 班级成绩表 
    where dengji=a.dengji 
    and fenshu>a.fenshu

    from 班级成绩表 a