Oracle分析函数 ratio_to_report,可以非常方便实现某列统计值占整个分组的比例。如统计某个区域销量占总销量的比重,某个月份销量占总销量的比重等。
数据库版本
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
源表数据
SQL> select * from t;
MONTH_ID AREA SALE
--------- ---- ----
201701 华北 100
201701 华南 40
201701 华东 40
201701 西北 20
201702 华北 100
201702 华南 40
201702 华东 40
201702 西北 20
--需求1 按区域统计销售额占比
--常规实现,用分析函数sum() over() 计算出分组的合计值
SQL> select t.area,
2 sum(sale) sale_sum,
3 sum(sum(sale)) over() sale_total,
4 sum(sale) / sum(sum(sale)) over() sale_ratio
5 from t
6 group by t.area;
AREA SALE_SUM SALE_TOTAL SALE_RATIO
---------- ---------- ---------- ----------
华北 200 400 0.5
华南 80 400 0.2
华东 80 400 0.2
西北 40 400 0.1
--ratio_to_report 分析函数实现
SQL> select t.area,
2 sum(sale) sale_sum,
3 ratio_to_report(sum(sale)) over() sale_ratio
4 from t
5 group by t.area;
AREA SALE_SUM SALE_RATIO
---------- ---------- ----------
华北 200 0.5
华南 80 0.2
华东 80 0.2
西北 40 0.1
--需求2 按月份分组,计算每个区域销售额占当月销售总额比重
SQL> select t.month_id,
2 t.area,
3 sale,
4 ratio_to_report(sale) over(partition by t.month_id) sale_ratio
5 from t;
MONTH_ID AREA SALE SALE_RATIO
------ ------ -------- -------
201701 华北 100 0.5
201701 华东 40 0.2
201701 华南 40 0.2
201701 西北 20 0.1
201702 华北 100 0.5
201702 华东 40 0.2
201702 华南 40 0.2
201702 西北 20 0.1