设为首页 收藏本站
查看: 2665|回复: 0

[经验分享] oracle group by子句的几种用法

[复制链接]

尚未签到

发表于 2016-8-3 16:07:22 | 显示全部楼层 |阅读模式
OracleGROUP BY语句除了最基本的语法外,还支持ROLLUPCUBE语句。
如果是ROLLUP(A, B, C)的话,首先会对(ABC)进行GROUP BY,然后对(AB)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。
如果是GROUP BY CUBE(A, B, C),则首先会对(ABC)进行GROUP BY,然后依次是(AB)(AC)(A)(BC)(B)(C),最后对全表进行GROUP BY操作。
 
 
1.       普通的group by
  

select trade_date, deal_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by trade_date, deal_type;

  
  
 
DSC0000.png
 
  
  
  
  
  
 
2.       使用group by rollup()单列
  

select trade_date, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by rollup(trade_date);

  
 
  
 
 
   
DSC0001.png
 可以看到,在最后一行做了汇总。

 
3.     使用group by rollup()多列
  

select trade_date, deal_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by rollup(trade_date, deal_type);  

  
 
  
 
 

DSC0002.png
 从上图可以看到
:
#1.根据trade_date做了汇总;
#2.最后一行做了总的汇总。
按照rollup()的语法,是不会对deal_typegroup by的。上面的SQL做了(trade_date,deal_type)的group by;(trade_date)的group by;以及对全表进行group by 操作。
 
如果是rollup()3列呢?

select trade_date, deal_type, deal_sub_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by rollup(deal_type, trade_date, deal_sub_type)
order by 1, 2, 3;

 
 
DSC0003.png
 

 
依次做了下面的group by操作:
#1.deal_typetrade_datedeal_sub_type);这个不用解释,上图很明显。
#2.deal_typetrade_date);第2行、第4行、第7行、第9行、第11行、第13行。
  #3.deal_type)。第14到第17行。
 第18行是总的一个汇总。
 
4.       使用cube()单列
  

select trade_date, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by cube(trade_date);

  
 
  
 

DSC0004.png
 

 
rollup()对比,你会发现rollup()是在最后一行汇总,cube()是在第1行。
如果想在最后一行汇总,可以使用order by trade_date nulls last排序。
如下:

select trade_date, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by cube(trade_date)
order by trade_date nulls last;

 
 
5.       使用cube()多列
  

select trade_date, deal_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by cube(trade_date, deal_type)
order by 1 nulls last;

  
 
  
 
 
DSC0005.png
 
 
order by 1 nulls last”中的1当然指的就是你查询的第1列,即trade_date了。
通过上图我们可以发现这样几点:
#1.对整体group by了。
#2.trade_date进行group by了。
#3.deal_type进行group by了。
#4.对整体进行汇总。
6.       使用groupinggrouping_id来标记group by的结果
  

select grouping(trade_date),
trade_date,
grouping(deal_type),
deal_type,
sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by cube(trade_date, deal_type)
order by 1 nulls last;

  
               
  

DSC0006.png
 

 
通过上图你可以发现,如果列的值为空,则显示的值为1;否则显示的0.
显示为1的就是合计的列,由此我们可以使用grouping_id来标识group by后的结果。

select decode(grouping_id(trade_date), 1, '合计', trade_date),
decode(grouping_id(deal_type), 1, '合计', deal_type),
sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by cube(trade_date, deal_type)
order by 1 nulls last;

 
DSC0007.png
 
 
原来合计的列显示的空白,现在都显示的“合计”。
7.       使用grouping sets
  

select trade_date, deal_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by grouping sets(trade_date, deal_type)
order by 1 nulls last;


  
 
DSC0008.png
 
  
 
你可以看到,上面的效果不正等同于使用union all吗?

select trade_date, null, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by trade_date
union all
select null, deal_type, sum(turnover)
from test t
where t.trade_date >= date '2013-08-10'
group by deal_type;

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252388-1-1.html 上篇帖子: Oracle正则表达式的用法 下篇帖子: Oracle函数返回表类型(结果集)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表