oracle分类排序/排行可以通过聚合函数rank() 和 dense_rank() 来实现。
rank() 和 dense_rank() :
--两种排名方式(分区和不分区):使用和不使用partition
--两种计算方式(连续,不连续),对应函数:dense_rank,rank
dense_rank与rank()用法相当,但是有一个区别:dence_rank在并列关系时,相关等级不会跳过,即连续。rank则跳过,即不连续。
Code
select sq,
dwmc,
decode(mbzql * 100 || '%', '%', '', mbzql * 100 || '%'),
decode(fhycnpjzql * 100 || '%', '%', '', fhycnpjzql * 100 || '%'),
decode(zdfhycnzhzql * 100 || '%', '%', '', zdfhycnzhzql * 100 || '%'),
decode(zxfhycnzhzql * 100 || '%', '%', '', zxfhycnzhzql * 100 || '%'),
decode(dlycnzql * 100 || '%', '%', '', dlycnzql * 100 || '%'),
decode(nfhyczhzql * 100 || '%', '0%', '', nfhyczhzql * 100 || '%'),
rank() over(partition by sq order by nfhyczhzql desc) new_rank,
CASE to_char(floor(nfhyczhzql * 100 - mbzql * 100))
WHEN '0' THEN
'一流'
WHEN '-1' THEN
'优秀'
WHEN '-2' THEN
'达标'
ELSE
' '
END "KHPJ"
from (select t.ssdq sq,
t.dwmc,
t.mbzql,
t.fhycnpjzql,
t.zdfhycnzhzql,
t.zxfhycnzhzql,
t.dlycnzql,
nvl(t.nfhyczhzql, 0) nfhyczhzql
from mw_app.PM_NW_FS_PZ_NDPMZB t
where to_char(jssj, 'yyyy') = '2008'
and dwmc is not null
order by sq, nfhyczhzql)
关于ORACLE对于取整的区别
1.取整(大)
select ceil(-1.001) value from dual
2.取整(小)
select floor(-1.001) value from dual
3.取整(截取)
select trunc(-1.002) value from dual
4.取整(舍入)
select round(-1.001) value from dual
这里需要注意的是,如果字段值为DBNull,系统会自动排序为1,这里首先做一下缺省值处理