mysql视图order by_如何在oracle数据库的视图里实现按一定字段排序(order by之后取行号)...

本文介绍了如何在Oracle数据库的视图中根据销量对产品进行部门排名,并生成对应的序号。首先通过`ORDER BY`对销量进行降序排序,然后利用`ROWNUM`获取序号,但初始序号是从1到所有记录数。为确保序号范围在1到14之间,使用`MOD`和`DECODE`函数进行调整,确保每个部门的排名序号正确。最终实现了视图的创建,解决了报表中序号生成的问题。
摘要由CSDN通过智能技术生成

a4c26d1e5885305701be709a3d33442f.png

如何在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

)

大功告成!

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值