您的位置:首页 > 数据库 > Oracle

Oracle SQL ratio_to_report函数、占比统计

2017-07-03 14:23 274 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息