ratio_to_report报表处理函数
除报告详细数据外,许多报告中还包括每行总数的百分比。例如,每名客户的订单相对于总订单的百分比,或每位销售代表的销售额相对于总销售额的百分比。
传统上,Oracle计算百分比的方法是在总计报告的子查询中使用SUM函数总计报告,然后把那个结果放到细节表中相除来计算百分比。
分析函数RATIO_TO_REPORT 用来计算当前记录的指标expr占开窗函数over中包含记录的所有同一指标的百分比. 这里如果开窗函数的统计结果为null或者为0,就是说占用比率的被除数为0或者为null, 则得到的结果也为0.
开窗条件query_partition_clause决定被除数的值, 如果用户忽略了这个条件, 则计算查询结果中所有记录的汇总值.
用户不能使用其他分析函数或者ratio_to_report作为分析函数ratio_to_report的参数expr, 也就是说这个函数不能循环使用. 但我们可以使用其他普通函数作为这个分析函数的查询结果.
RATIO_TO_REPORT解析函数使得这种类型的查询更容易编码。它的格式如下:
RATIO_TO_REPORT (expr) OVER(query_partition_clause)
- /* FORMATTEDON 2009/11/10 20:24 (FORMATTER PLUS V4.8.8) */
- SELECT ENAME, SAL, DEPTNO, RATIO_TO_REPORT (SAL) OVER () AS RR
- FROM SCOTT.EMP
- WHERE DEPTNO = 10;
ENAME |
SAL |
DEPTNO |
RR |
CLARK |
2,450 |
10 |
0.28 |
KING |
5,000 |
10 |
0.571428571428571 |
MILLER |
1,300 |
10 |
0.148571428571429 |
- /* FORMATTEDON 2009/11/10 20:36 (FORMATTER PLUS V4.8.8) */
- SELECT ENAME, SAL, DEPTNO,
- RATIO_TO_REPORT (SAL) OVER (PARTITION BY DEPTNO) AREA_PCT
- FROM SCOTT.EMP;
ENAME |
SAL |
DEPTNO |
AREA_PCT |
CLARK |
2,450.0000000000 |
10 |
0.2800000000 |
KING |
5,000.0000000000 |
10 |
0.5714285714 |
MILLER |
1,300.0000000000 |
10 |
0.1485714286 |
JONES |
2,975.0000000000 |
20 |
0.2735632184 |
FORD |
3,000.0000000000 |
20 |
0.2758620690 |
ADAMS |
1,100.0000000000 |
20 |
0.1011494253 |
SMITH |
800.0000000000 |
20 |
0.0735632184 |
SCOTT |
3,000.0000000000 |
20 |
0.2758620690 |
WARD |
1,250.0000000000 |
30 |
0.1329787234 |
TURNER |
1,500.0000000000 |
30 |
0.1595744681 |
ALLEN |
1,600.0000000000 |
30 |
0.1702127660 |
JAMES |
950.0000000000 |
30 |
0.1010638298 |
BLAKE |
2,850.0000000000 |
30 |
0.3031914894 |
MARTIN |
1,250.0000000000 |
30 |
0.1329787234 |
First,Last,First_value,Last_value取基数的分析函数
First功能描述:从DENSE_RANK返回的集合中取出排在最前面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录。
Last功能描述:从DENSE_RANK返回的集合中取出排在最后面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录。
FIRST_VALUE、LAST_VALUE:返回结果集中排在第一位和最后一位的值。
语法是:FIRST_VALUE (expr) OVER ( analytic_clause)
- /* FORMATTEDON 2009/11/10 20:51 (FORMATTER PLUS V4.8.8) */
- SELECT ENAME, DEPTNO, SAL,
- MIN (SAL)KEEP (DENSE_RANK FIRST ORDER BY DEPTNO) OVER (PARTITION BY DEPTNO) "Worst",
- MAX (SAL)KEEP (DENSE_RANK LAST ORDER BY DEPTNO) OVER (PARTITION BY DEPTNO) "Best"
- FROM SCOTT.EMP;