Oracle开发专题之:报表函数(转载)目录1.报表函数简介2.RATIO_T
Oracle开发专题之:报表函数(转载)
目录
=========================================
1.报表函数简介
2.RATIO_TO_REPORT函数
一、报表函数简介:
回顾一下前面《Oracle开发专题之:窗口函数》中关于全统计一节,我们使用了Oracle提供的:
sum(sum(tot_sales))?over?(order?by?month?rows?between?unbounded?preceding?and?unbounded?following)
来统计全年的订单总额,这个函数会在记录集形成的过程中,每检索一条记录就执行一次,它总共执行了12次。这是非常费时的。实际上我们还有更简便的方法:
SQL>?select?month,
??2?????????sum(tot_sales)?month_sales,
??3?????????sum(sum(tot_sales))?over(order?by?month
??4?????????rows?between?unbounded?preceding?and?unbounded?following)?win_sales,
??5?????????sum(sum(tot_sales))?over()?rpt_sales
??6????from?orders
??7???group?by?month;
?????MONTH?MONTH_SALES?WINDOW_SALES?REPORT_SALES
----------?-----------?------------?------------
?????????1??????610697??????6307766??????6307766
?????????2??????428676??????6307766??????6307766
?????????3??????637031??????6307766??????6307766
?????????4??????541146??????6307766??????6307766
?????????5??????592935??????6307766??????6307766
?????????6??????501485??????6307766??????6307766
?????????7??????606914??????6307766??????6307766
?????????8??????460520??????6307766??????6307766
?????????9??????392898??????6307766??????6307766
????????10??????510117??????6307766??????6307766
????????11??????532889??????6307766??????6307766
????????12??????492458??????6307766??????6307766
已选择12行。
over函数的空括号表示该记录集的所有记录都应该被列入统计的范围,如果使用了partition by则先分区,再依次统计各个分区。
二、RATIO_TO_REPORT函数:
报表函数(窗口函数)特别适合于报表中需要同时显示详细数据和统计数据的情况。例如在销售报告中经常会出现这样的需求:列出上一年度每个月的销售总额、年底销售额以及每个月的销售额占全年总销售额的比例:
方法①:
select?all_sales.*,
???????????100?*?round(cust_sales?/?region_sales,?2)?||?'%'?Percent
?from?(select?o.cust_nbr?customer,
????????????????????????o.region_id?region,
???????????????????????sum(o.tot_sales)?cust_sales,
???????????????????????sum(sum(o.tot_sales))?over(partition?by?o.region_id)?region_sales
???????????????from?orders_tmp?o
????????????where?o.year?=?2001
?????????????group?by?o.region_id,?o.cust_nbr)?all_sales
?where?all_sales.cust_sales?>?all_sales.region_sales?*?0.2;
这是一种笨方法也是最易懂的方法。
方法②:
select?region_id,?salesperson_id,?
???????????sum(tot_sales)?sp_sales,
???????????round(sum(tot_sales)?/?sum(sum(tot_sales))?
???????????????????? ?over?(partition?by?region_id),?2)?percent_of_region
??from?orders
where?year?=?2001
?group?by?region_id,?salesperson_id
?order?by?region_id,?salesperson_id;
方法③
select?region_id,?salesperson_id,?
????????????sum(tot_sales)?sp_sales,
????????????round(
ratio_to_report(sum(tot_sales))?
??????????????????????????over?(partition?by?region_id),?2)?sp_ratio
???from?orders
where?year?=?2001
group?by?region_id,?salesperson_id
order?by?region_id,?salesperson_id;
Oracle提供的Ratio_to_report函数允许我们计算每条记录在其对应记录集或其子集中所占的比例。
?
转载自:http://www.blogjava.net/pengpenglin/archive/2008/06/29/211462.html