ORACLE GROUPING函数的使用_塔山上的山的博客-程序员宅基地

技术标签: oracle基础  


ORACLE GROUPING函数的使用

GROUPING函数可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。

关于ROLLUP和CUBE函数的使用,请参见另一篇文章:
http://blog.csdn.net/wh62592855/archive/2009/11/16/4817920.aspx

1、在ROLLUP中对单列使用GROUPING()

SQL> select division_id,sum(salary)
  from employees2
  group by rollup(division_id)
  order by division_id;

DIV SUM(SALARY)
--- -----------
BUS        1610000
OPE        1320000
SAL        4936000
SUP        1015000
              8881000

加上GROUPING来看看

SQL> select grouping(division_id),division_id,sum(salary)
  from employees2
  group by rollup(division_id)
  order by division_id;

GROUPING(DIVISION_ID) DIV SUM(SALARY)
--------------------- --- -----------
                                      0 BUS        1610000
                                      0 OPE        1320000
                                      0 SAL        4936000
                                      0 SUP        1015000
                                                    8881000
可以看到,为空的地方返回1,非空的地方返回0。

2、使用CASE转换GROUPING()的返回值

可能你会觉得前面的0和1太枯燥了,代表不了任何意义,说白了就是不够人性化,呵呵。这个时候我们可以使用CASE来转换为一些有意义的值。

SQL> select
  case grouping(division_id)
  when 1 then 'all divisions'
  else division_id
  end as div,
  sum(salary)
  from employees2
  group by rollup(division_id)
  order by division_id;

DIV                    SUM(SALARY)
------------- -----------
BUS                            1610000
OPE                            1320000
SAL                            4936000
SUP                            1015000
all divisions        8881000

3、使用CASE和GROUPING()转换多个列的值

SQL> select
  case grouping(division_id)
  when 1 then 'all divisions'
  else division_id
  end as div,
  case grouping(job_id)
  when 1 then 'all jobs'
  else job_id
  end as job,
  10  sum(salary)
  11  from employees2
  12  group by rollup(division_id,job_id)
  13  order by division_id,job_id;

DIV                    JOB          SUM(SALARY)
------------- -------- -----------
BUS                    MGR                    530000
BUS                    PRE                    800000
BUS                    WOR                    280000
BUS                    all jobs        1610000
OPE                    ENG                    245000
OPE                    MGR                    805000
OPE                    WOR                    270000
OPE                    all jobs        1320000
SAL                    MGR                  4446000
SAL                    WOR                    490000
SAL                    all jobs        4936000

DIV                    JOB          SUM(SALARY)
------------- -------- -----------
SUP                    MGR                    465000
SUP                    TEC                    115000
SUP                    WOR                    435000
SUP                    all jobs        1015000
all divisions all jobs        8881000

16 rows selected.

4、CUBE与GROUPING()结合使用

SQL> select
  case grouping(division_id)
  when 1 then 'all divisions'
  else division_id
  end as div,
  case grouping(job_id)
  when 1 then 'all jobs'
  else job_id
  end as job,
  10  sum(salary)
  11  from employees2
  12  group by cube(division_id,job_id)
  13  order by division_id,job_id;

DIV                    JOB          SUM(SALARY)
------------- -------- -----------
BUS                    MGR                    530000
BUS                    PRE                    800000
BUS                    WOR                    280000
BUS                    all jobs        1610000
OPE                    ENG                    245000
OPE                    MGR                    805000
OPE                    WOR                    270000
OPE                    all jobs        1320000
SAL                    MGR                  4446000
SAL                    WOR                    490000
SAL                    all jobs        4936000

DIV                    JOB          SUM(SALARY)
------------- -------- -----------
SUP                    MGR                    465000
SUP                    TEC                    115000
SUP                    WOR                    435000
SUP                    all jobs        1015000
all divisions ENG                    245000
all divisions MGR                  6246000
all divisions PRE                    800000
all divisions TEC                    115000
all divisions WOR                  1475000
all divisions all jobs        8881000

21 rows selected.

5、使用GROUPING SETS子句

使用GROUPING SETS子句可以只返回小计记录。

SQL> select division_id,job_id,sum(salary)
  from employees2
  group by grouping sets(division_id,job_id)
  order by division_id,job_id;

DIV JOB SUM(SALARY)
--- --- -----------
BUS                1610000
OPE                1320000
SAL                4936000
SUP                1015000
      ENG          245000
      MGR        6246000
      PRE          800000
      TEC          115000
      WOR        1475000

9 rows selected.

转自:http://blog.csdn.net/wh62592855/article/details/4818072
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/li19236/article/details/41486229

智能推荐

IOS中的Block在C++中的运用_MOKA的博客-程序员宅基地_block c++

1.iOS中block基本demoA视图->B视图,B视图传值给A视图A视图的代码片段:[cpp] view plain copy - (IBAction)action2OtherView:(id)sender  {      MyView *myView = [[MyView alloc] init];      myView.func = ^(int x

phpcms过滤php,苗景云的博客_Leo瓜牛的博客-程序员宅基地

phpcms V9填写转向链接,如果链接中包含#会被过滤掉,解决方案如下:打开phpcms/modle/content_model.class.php,搜索linkurl,找到附近的str_replace函数,将其中的 '#', 删除。一共三处!第一处98行//更新URL地址if($data['islink']==1){$urls[0]=trim_script($_POST['linkur...

pip安装的东西都放在了什么路径下_Gabriel_wei的博客-程序员宅基地_pip路径

我们发现,一般都是在你的python路径下lib包下的site-packages,看各自实际情况了转自

oracle 一分钟,如何将Oracle 当前日期加一天、一分钟_weixin_39874269的博客-程序员宅基地

在Oralce中我发现有add_months函数,加天数N可以用如下方法实现,select sysdate+N from dual , sysdate+1 加一天 sysdate+1/24 加1小时 sysdate+1/(24*60) 加1分钟 sysdate+1/(24*60*60) 加1秒钟 类推至毫秒0.001秒 加法 select sysdate,add_months(sysdate,...

oracle longtext类型,C#读取oracle long raw数据类型_可爱可乐少女的博客-程序员宅基地

protected void Page_Load(object sender, EventArgs e) { string connstr = "server=MES01;user id=SAID;password=SADBA"; string deleteSql = "truncate table SA.CA_TERMINAL_IP"; ...

字节跳动开源云原生机器学习平台 Klever_Docker_的博客-程序员宅基地

字节跳动基础架构团队基于火山引擎机器学习平台 Clever 及其丰富的行业落地经验,推出开源项目 Klever,以工程化的方式降低智能技术落地门槛,助力企业快速打造智能业务。近年来,智能...

随便推点

hdu5365_Think_Idea的博客-程序员宅基地

题目链接:点击打开链接题目意思:在平面中给出一些点(这些点的坐标都为整数),从中选取一些点构成正三角形、正四边形、正五边形、正六边形,问一共有多少种方案?解题思路:1、题目给出的n2、但是正五边形,正六边形判断起来感觉很麻烦,而且枚举6个点肯定会超时,所以比赛时没有思路3、解题报告中指出:地球人都知道整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个

mysql binlog pid_Mysql binlog设置_weixin_30562757的博客-程序员宅基地

一:Binlog文件信息1. binlog基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中;2.作用:MySQL的作用类似于Oracle的归档日志,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作)、数据库增量备份和恢复(增量备份和基于时间点的恢复)、Mysql的复制(主主数据库的复制、主从数据库的复制)3. binglo...

[转] 这样学英语三个月超过你过去学三年_weixin_30364325的博客-程序员宅基地

本文作者三年间从四级勉强及格到高级口译笔试210,口试232。找工作面试时给其口试的老外考官听了一分钟就说你的英语不用考了。虽不敢说方法一定是最好的,但从现在开始随便谁不要再去找学习资料,每天花两个钟头照说的做,坚持三个月的提高会超过你过去三年。听:网上比较有代表性的论坛是普特www.putclub.com上面的听力资源很丰富,沪江www.hjenglish.com和旺旺www.wwenglish...

ORA-01849: hour must be between 1 and 12__明月的博客-程序员宅基地

解决方案:参考博客一: ORA-01849 :小时值必须介于1和12之间! 参考博客二: ORA-01849: hour must be between 1 and 12 ...

iOS高效开发 —— 管理第三方框架工具 CocoaPods使用_极客James的博客-程序员宅基地

当你开发iOS应用时,会经常使用到很多第三方开源类库,比如MJExtension,AFNetWorking, MJRefresh等。可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其他类库又用到其他类库,“子子孙孙无穷尽也”,这也许是比较特殊的情况。手动一个个去下载所需类库十分麻烦。另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下载新版本,重新加入到项目中,十分麻烦。如果能有什么工具能

SpringMVC返回json格式数据出现关于“No converter found for return value of type: class xxx”的解决方法_mojiejieYXM的博客-程序员宅基地

SpringMVC返回json格式数据出现关于“No converter found for return value of type: class xxx”的解决方法今天搭建了Spring+SringMVC+mybatis后台框架写课设,写了一个请求响应的消息类,想让后端返回该类的json格式数据,在使用中出现错误:之后上网搜了发现是因为要处理json对象的类,数据必须要有相关的get和set方法(粗心)因为这个消息类是我从一个Springboot项目里直接拿来,当时是在Springboot项目使