Oracle分析函数 ratio_to_report,统计


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章