如何在oracle数据库的视图里实现按一定字段排序(order by之后取行号)
(2006-04-17 10:39:47)
今天一早就要改一个视图,要求视图取得的数据按照指标排序,而且把序号给取出来(1到14)。
情况并不是只有14条记录然后排序那么简单。听我娓娓道来~
假设有一个表product_num,有如下字段
date_no 日期,
dept_id 部门id,
product_id 产品id,
num 售出产品数量.
每一个日期,一个部门,一个产品类型就有一条记录,指标为售出产品数量。现在要写一个视图,每天每种产品给各个部门进行销量排名,展现在报表中。假设共有14个部门,那么每天的报表,每个产品类型就要有一个14行记录的报表,排名序号从1-14。
首先我们要考虑如何在视图里就取得序号(当然,如果没有这个要求,那么序号完全可以在报表工具里生成,但是我们要研究的就是在视图里取得序号)。
首先先不取序号,先排名,那么很简单
create or replace view Product_Rank_View as
select date_no,product_id,dept_id,num from product_num
order by num desc
然后如何取得序号呢?既然是ORACLE数据库,当然立刻想到rownum这个关键字。
这样,视图修改如下:
create or replace view Product_Rank_View as
select rownum as rank,date_no,product_id,dept_id,num from
(select date_no,product_id,dept_id,num from product_num
order by num desc)
order by date_no,product_id,rank
这个视图里,首先在子查询里按照销量排名(注意,这里的排名是按照所有记录排名哦,比如有30天,10种产品,14个部门的销量记录,那就有30×10×14=4200条记录,4200条记录大排序),然后在外层查询里取rownum,然后才分日期和产品进行部门排名order by date_no,product_id,rank。
似乎视图改到这里已经好了,但是取数据的时候发现,序号并不是从1到14,因为刚才在进行大排序的时候取到的是从1到4200的序号。所以这里的序号可能是:
200
343
521
……
3129
4218
这样看起来很不爽。所以再把视图改一下:
create or replace view Product_Rank_View as
select mod(rank+2,14) as detail_rank,date_no,product_id,dept_id,num from
(select rownum as rank,date_no,product_id,dept_id,num from
(select date_no,product_id,dept_id,num from product_num
order by num desc)
order by date_no,product_id,rank
)
order by rank
这样,排名就成了从1-13,最后一位是0,应该该成14,简单,用decode就可以了。
create or replace view Product_Rank_View as
select decode(mod(rank+2,14),0,14,mod(rank+2,14)) as detail_rank,date_no,product_id,dept_id,num from
(select rownum as rank,date_no,product_id,dept_id,num from
(select date_no,product_id,dept_id,num from product_num
order by num desc)
order by date_no,product_id,rank
)
大功告成!
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。