度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 3134|回复: 10
打印 上一主题 下一主题

[分享] oracle ratio_to_report:计算占总数百分比

[复制链接]

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
跳转到指定楼层
楼主
发表于 2020-7-8 15:00:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

数据库如何用Oracle RATIO_TO_REPORT计算总数百分比



除报告详细数据外,许多报告中还包括每行总数的百分比。例如,每名客户的订单相对于总订单的百分比,或每位销售代表的销售额相对于总销售额的百分比。


传统上,Oracle计算百分比的方法是在总计报告的子查询中使用SUM函数总计报告,然后把那个结果放到细节表中相除来计算百分比。你还可以用一个子查询作为SELECT语句表达式:


RATIO_TO_REPORT解析函数使得这种类型的查询更容易编码。Oracle 8i中引入了这个函数,它的格式如下:


RATIO_TO_REPORT (expr) OVER (query_partition_clause)


  列表A说明一个简单的例子。对163号销售代表来说,每位客户的销售额占这名销售代表的总销售额的百分比是多少呢?在这种情况下,查询分区子句(partition clause)为空,因此得到的结果是对返回的所有行计算得出。


  列表B增加了一个查询分区子句,进一步按客户细分报告。PARTITION BY customer_id子句重新安排每位客户的总数,进而说明每名客户的哪次订单最为关键。你可以查看客户102的情况,他的两个订单相对平衡;


但客户103的一个订单占这名客户总订单额的很大一部分。



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.



===========================================================


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.




===============================================================



SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr
   FROM employees
   WHERE job_id = 'PU_CLERK';


LAST_NAME                     SALARY         RR
------------------------- ---------- ----------
Khoo                            3100 .223021583
Baida                           2900 .208633094
Tobias                          2800 .201438849
Himuro                          2600  .18705036
Colmenares                      2500 .179856115

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
沙发
 楼主| 发表于 2020-7-8 15:01:29 | 只看该作者
回复 支持 反对

使用道具 举报

235

主题

2547

帖子

5835

积分

论坛元老

Rank: 8Rank: 8

积分
5835
板凳
发表于 2020-7-8 17:32:32 | 只看该作者
回复 支持 反对

使用道具 举报

141

主题

1551

帖子

3573

积分

论坛元老

Rank: 8Rank: 8

积分
3573
地板
发表于 2020-7-8 17:35:31 | 只看该作者
回复 支持 反对

使用道具 举报

141

主题

1551

帖子

3573

积分

论坛元老

Rank: 8Rank: 8

积分
3573
5#
发表于 2020-7-8 17:43:34 | 只看该作者
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
6#
 楼主| 发表于 2020-7-9 14:04:01 | 只看该作者
回复 支持 反对

使用道具 举报

235

主题

2547

帖子

5835

积分

论坛元老

Rank: 8Rank: 8

积分
5835
7#
发表于 2020-7-9 17:22:25 | 只看该作者
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
8#
 楼主| 发表于 2020-7-11 14:28:31 | 只看该作者
回复 支持 反对

使用道具 举报

235

主题

2547

帖子

5835

积分

论坛元老

Rank: 8Rank: 8

积分
5835
9#
发表于 2020-7-11 17:41:26 | 只看该作者
回复 支持 反对

使用道具 举报

141

主题

1551

帖子

3573

积分

论坛元老

Rank: 8Rank: 8

积分
3573
10#
发表于 2020-7-12 16:28:01 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-16 03:01 , Processed in 0.147306 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表