分析函数ratio_to_report的使用

本文介绍了 Oracle 数据库中的 Ratio_to_Report 函数,该函数用于计算当前记录的指标占开窗函数中所有相同指标的百分比。文章通过具体示例展示了如何使用此函数来计算员工工资在其所属部门总工资中的占比。
部署运行你感兴趣的模型镜像

Ratio_to_report函数

Syntax

分析函数RATIO_TO_REPORT 用来计算当前记录的指标expr占开窗函数over中包含记录的所有同一指标的百分比. 这里如果开窗函数的统计结果为null或者为0,就是说占用比率的被除数为0或者为null, 则得到的结果也为0.

开窗条件query_partition_clause决定被除数的值, 如果用户忽略了这个条件, 则计算查询结果中所有记录的汇总值.

用户不能使用其他分析函数或者ratio_to_report作为分析函数ratio_to_report的参数expr, 也就是说这个函数不能循环使用. 但我们可以使用其他普通函数作为这个分析函数的查询结果.

 Examples 1

     下面的示例演示了如何计算每一个员工的工资占部门全部工资的比例.

创建表

create table T_salary(
F_depart
varchar2(20),
F_EMP
varchar2(20),
F_salary
integer
);

truncate table t_salary;
--
插入测试数据
insert into t_salary(f_depart, f_emp, f_salary)
select '信息管理部','张三',10000 from dual
union all
select '信息管理部','李四',2000 from dual
union all
select '人力资源部','王五',3000 from dual
union all
select '人力资源部','赵六',10000 from dual;

commit;

--
查询每个员工占所在部门的工资比例

select f_depart,f_emp,f_salary,sum(f_salary) over(partition by f_depart) sum_salary,
  ratio_to_report(f_salary) over(
partition by f_depart) ratio_salary
from t_salary;

--递归查询员工占所在部门的百分比, 以及部门所占公司的工资比例.

select f_depart,f_emp,f_salary,g1,
  
sum(f_salary) over(partition by decode(g1, 0, f_depart,  null), g1) sum_salary,
   ratio_to_report(f_salary) over(
partition by decode(g1, 0, f_depart, null), g1) r_salary
from (      
select f_depart,
       f_emp,
      
sum(f_salary) f_salary, grouping(f_depart) + grouping(F_emp) g1
 
from t_salary
 
group by rollup(f_depart, f_emp)
 ) t

 

 

    由于分析函数可以使用普通函数的结果作为expr参数, 所以上面的代码又可以整合为下述方式.

select f_depart,
       f_emp,
      
sum(f_salary) f_salary,
      
sum(sum(f_salary)) over(partition by decode(grouping(f_depart) + grouping(F_emp), 0, f_depart, null), grouping(f_depart) + grouping(F_emp)) sum_salary,
       ratio_to_report(
sum(f_salary)) over(partition by decode(grouping(f_depart) + grouping(F_emp), 0, f_depart, null), grouping(f_depart) + grouping(F_emp)) r_salary,
      
grouping(f_depart) + grouping(F_emp) g1
 
from t_salary
 
group by rollup(f_depart, f_emp)

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 使用 `RATIO_TO_REPORT` 函数进行比例分摊计算 `RATIO_TO_REPORT` 是 Oracle 提供的一个分析函数,用于计算某个数值在整体或分组数据中所占的比例。它通常用于比例分摊、百分比展示等场景。该函数的语法如下: ```sql RATIO_TO_REPORT(expr) OVER ([query_partition_clause]) ``` 其中,`expr` 是需要计算比例的数值列,`OVER` 子句可以指定是否按某些列进行分组。 #### 数据准备 根据提供的测试数据,创建表并插入数据: ```sql CREATE TABLE TSHARESTREAM_TEST ( rank_id INTEGER, c_saleserialno VARCHAR2(255), c_originalno VARCHAR2(255), f_saleshares NUMBER(16,2) ); INSERT INTO TSHARESTREAM_TEST (RANK_ID, C_SALESERIALNO, C_ORIGINALNO, F_SALESHARES) VALUES (1510, '0050000001533', NULL, 1.00); INSERT INTO TSHARESTREAM_TEST (RANK_ID, C_SALESERIALNO, C_ORIGINALNO, F_SALESHARES) VALUES (1510, '0050000001533', NULL, 1.00); INSERT INTO TSHARESTREAM_TEST (RANK_ID, C_SALESERIALNO, C_ORIGINALNO, F_SALESHARES) VALUES (1510, '0050000001533', NULL, 3.00); ``` #### 使用 `RATIO_TO_REPORT` 进行比例计算 以下是一个使用 `RATIO_TO_REPORT` 的示例查询,计算每个记录的 `f_saleshares` 在整体数据中的比例,并转换为百分比形式: ```sql SELECT rank_id, c_saleserialno, c_originalno, f_saleshares, ROUND(RATIO_TO_REPORT(f_saleshares) OVER () * 100, 2) || '%' AS "占总比例" FROM TSHARESTREAM_TEST; ``` 上述查询中,`RATIO_TO_REPORT(f_saleshares) OVER ()` 计算的是每条记录的 `f_saleshares` 值在整个表数据中的比例。通过乘以 100 并使用 `ROUND` 函数,将其转换为百分比形式,并附加百分号。 #### 按分组计算比例 如果需要按某些字段(例如 `rank_id`)进行分组,并计算每组内记录的比例,可以在 `OVER` 子句中使用 `PARTITION BY`。例如: ```sql SELECT rank_id, c_saleserialno, c_originalno, f_saleshares, ROUND(RATIO_TO_REPORT(f_saleshares) OVER (PARTITION BY rank_id) * 100, 2) || '%' AS "占组内比例" FROM TSHARESTREAM_TEST; ``` 上述查询中,`PARTITION BY rank_id` 表示按 `rank_id` 分组,计算每组内 `f_saleshares` 的比例。 #### 尾差处理 在实际应用中,由于浮点数的精度问题,计算结果可能会存在尾差。为了消除尾差,可以使用 `ROUND` 或 `TRUNC` 函数进行四舍五入或截断处理。例如: ```sql SELECT rank_id, c_saleserialno, c_originalno, f_saleshares, ROUND(RATIO_TO_REPORT(f_saleshares) OVER () * 100, 2) AS "调整后比例" FROM TSHARESTREAM_TEST; ``` 通过设置适当的精度(例如 `2` 位小数),可以有效减少尾差对结果的影响。 #### 示例数据计算 假设表中数据如下: | rank_id | c_saleserialno | c_originalno | f_saleshares | |---------|----------------|--------------|--------------| | 1510 | 0050000001533 | NULL | 1.00 | | 1510 | 0050000001533 | NULL | 1.00 | | 1510 | 0050000001533 | NULL | 3.00 | 计算每条记录的 `f_saleshares` 占总和的比例: - 总和为 `1.00 + 1.00 + 3.00 = 5.00` - 第一条记录:`1.00 / 5.00 = 0.20`(20%) - 第二条记录:`1.00 / 5.00 = 0.20`(20%) - 第三条记录:`3.00 / 5.00 = 0.60`(60%) 查询结果如下: | rank_id | c_saleserialno | c_originalno | f_saleshares | 调整后比例 | |---------|----------------|--------------|--------------|------------| | 1510 | 0050000001533 | NULL | 1.00 | 20.00 | | 1510 | 0050000001533 | NULL | 1.00 | 20.00 | | 1510 | 0050000001533 | NULL | 3.00 | 60.00 | #### 小结 `RATIO_TO_REPORT` 函数是 Oracle 中非常实用的分析函数,能够快速计算某个数值在整体或分组数据中的比例。通过结合 `ROUND` 函数,可以有效处理尾差问题,确保结果的准确性。在实际应用中,可以灵活使用 `PARTITION BY` 对数据进行分组计算,满足不同场景的需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值