分类: Oracle
2008-04-03 22:05:19
除报告详细数据外,许多报告中还包括每行总数的百分比。例如,每名客户的订单相对于总订单的百分比,或每位销售代表的销售额相对于总销售额的百分比。
传统上,Oracle计算百分比的方法是在总计报告的子查询中使用SUM函数总计报告,然后把那个结果放到细节表中相除来计算百分比。你还可以用一个子查询作为SELECT语句表达式:
RATIO_TO_REPORT解析函数使得这种类型的查询更容易编码。Oracle 8i中引入了这个函数,它的格式如下:
RATIO_TO_REPORT (expr) OVER (query_partition_clause)
说明一个简单的例子。对163号销售代表来说,每位客户的销售额占这名销售代表的总销售额的百分比是多少呢?在这种情况下,查询分区子句(partition clause)为空,因此得到的结果是对返回的所有行计算得出。增加了一个查询分区子句,进一步按客户细分报告。
PARTITION BY customer_id子句重新安排每位客户的总数,进而说明每名客户的哪次订单最为关键。你可以查看客户102的情况,他的两个订单相对平衡;但客户103的一个订单占这名客户总订单额的很大一部分。
Oracle解析可帮助你节省编码时间,并在执行过程中生成更加有效的查询。
(OCP、MCDBA、MCSE、MCT)是一位有25年经验的计算机专业人士,从事过技术培训师、顾问与数据库管理员等职。现在他在达拉斯/沃尔斯堡地区的B. Watkins数据库顾问和培训公司担任高级顾问兼管理合作伙伴。
Listing A SELECT sales_rep_id, customer_id, order_total, ratio_to_report(order_total) OVER () pct_total FROM orders WHERE sales_rep_id = 163 ORDER BY sales_rep_id, customer_id, order_id / SQL> @ratioreport_a SALES_REP_ID CUSTOMER_ID ORDER_TOTAL PCT_TOTAL ------------ ----------- ----------- ---------- 163 102 5610.6 .043747539 163 102 10523 .082051002 163 103 78 .00060819 163 103 13550 .105653433 163 105 1926.6 .015022281 163 106 5546.6 .043248512 163 117 3878.4 .030241054 163 147 1500.8 .01170219 163 149 9055 .070604564 163 156 68501 .53412294 163 157 7110.3 .055441152 163 160 969.2 .007557144 12 rows selected. SQL>Listing B col order_total format 999,999.00 col pct_total format 999.00 SELECT sales_rep_id, customer_id, order_total, ROUND(100*ratio_to_report(order_total) OVER (PARTITION BY customer_id),2) pct_total FROM orders WHERE sales_rep_id = 163 ORDER BY sales_rep_id, customer_id, order_id/ SQL> @ratioreport_b SALES_REP_ID CUSTOMER_ID ORDER_TOTAL PCT_TOTAL ------------ ----------- ----------- --------- 163 102 5,610.60 34.78 163 102 10,523.00 65.22 163 103 78.00 .57 163 103 13,550.00 99.43 163 105 1,926.60 100.00 163 106 5,546.60 100.00 163 117 3,878.40 100.00 163 147 1,500.80 100.00 163 149 9,055.00 100.00 163 156 68,501.00 100.00 163 157 7,110.30 100.00 163 160 969.20 100.00 12 rows selected. SQL> spool off