本文主要介绍,报表在使用group by rollup和group by cube后的辅助函数。

CREATE TABLE TEST8
(    "ID" NUMBER,     "ORDERID" NUMBER, "PRODUCTID" NUMBER, "PRICE" NUMBER(10,2), "QUANTITY" NUMBER
)
insert into TEST8 (ID, ORDERID, PRODUCTID, PRICE, QUANTITY) values (1, 1, 1, 3, 10);
insert into TEST8 (ID, ORDERID, PRODUCTID, PRICE, QUANTITY) values (2, 1, 2, 4, 5);
insert into TEST8 (ID, ORDERID, PRODUCTID, PRICE, QUANTITY) values (3, 1, 3, 10, 2);
insert into TEST8 (ID, ORDERID, PRODUCTID, PRICE, QUANTITY) values (4, 2, 1, 3, 6);
insert into TEST8 (ID, ORDERID, PRODUCTID, PRICE, QUANTITY) values (5, 2, 2, 4, 6);

基础数据

1、GROUPING函数

使用GROUPING函数处理汇总结果(在使用group by rollup和group by cube后的结果集)中的空值。

select orderid,productid,count(orderid) ordercount from test8 group by cube(orderid,productid) order by orderid;

结果集按照orderid和productid进行汇总之后,出现了很多的空值,具体原因参考哥前面的随笔 ,so,必须解决这个问题,因为null值对报表结果来说没什么用,我们大致都会用0,'空','NULL'之类,来表示空值,所以GROUPING函数就是来干这个的.看代码:

select GROUPING(orderid) orderid,productid,count(orderid) ordercount from test8 group by cube(orderid,productid) order by orderid;

对比上面的没有使用GROUPING函数的结果集我们发现

当orderid为null值的时候grouping(orderid)的值为1,反之为0

所以:根据这个特点我们可以推断出GROUPING函数的用法:

GROUPING(字段),如果字段值为null,GROUPING(字段)返回1,反之返回0。

通过GROUPING(字段名)的这个特点,在结果case when then else end函数,就可以将null值修改为任何字段名类型的值了,代码如下:

select case GROUPING(orderid) when 1 then 0 else orderid end orderid,productid,count(orderid) ordercount from test8 group by cube(orderid,productid) order by orderid;

null值全部改为了0

2、GROUPING  SETS函数

和哥前面的随笔一样,不知道它的功能没关系,先试一试,在根据结果集推出来他的功能,不多说,上代码:

i、现在需要求出每个订单下每个产品的订单数

(1)group by解决方法:

select orderid,productid,count(orderid) from test8 group by (orderid,productid) order by orderid 

(2)group by grouping sets解决方案

这边因为不知道他的功能,那么就直接上代码猜:

a、猜想一:grouping sets(orderid,productid)

select orderid,productid,count(orderid) from test8 group by grouping sets(orderid,productid) order by orderid 

根据结果集很容易的发现,group by grouping sets(orderid,productid)的结果集等于group by orderid 和group by productid的合集,

下面验证猜想:

select orderid,null productid,count(orderid) ordercount from test8 group by(orderid)
union
select null orderid,productid,count(orderid) ordercount from test8 group by(productid) 

ok,我们的猜想是正确,但是grouping sets(orderid,productid)并不能解i的需求,于是继续猜

b、猜想二:group by grouping sets(orderid,productid)

select orderid,productid,count(orderid) ordercount from test8 group by grouping sets((orderid,productid)) order by orderid 

ok,猜想二符合i提出的需求

ii、总结grouping sets的功能

根据上面的猜想大致可以推出grouping sets的功能:grouping by是group by的集合

GROUP BY GROUPING SETS (A,B,C)  等价与  GROUP BY A  UNION ALL  GROUP BY B  UNION ALL  GROUP BY C  

注意:grouping sets的特殊用法,grouping sets内部的最小单位是单个字段,其次是一个多个字段的几个用(字段1,字段2,......)表示,但是不支持嵌套括号,也没有必要,因为大多数情况下的报表都是2维的。

GROUP BY GROUPING SETS ((A,B,C))  等价与  GROUP BY A,B,C  GROUP BY GROUPING SETS (A,(B,C))  等价与  GROUP BY A  UNION ALL  GROUP BY B,C  

我们还可以混合使用,如下:

GROUP BY A                     等价于  GROUP BY A  ,B                                     ,B  ,GROUPING SETS ((B,C))                 ,C  GROUP BY A                    等价于  GROUP BY A,B,C  ,B                            UNION ALL  ,GROUPING SETS (B,C)          GROUP BY A,B  GROUP BY A                    等价于 GROUP BY A,B,C  ,B                           UNION ALL  ,C                           GROUP BY A,B,C  ,GROUPING SETS (B,C)   

iii、Group by  Grouping sets解决的问题:

更加灵活的处理一些报表的统计工作,因为使用group by rollup 和group by cube都是固定格式的统计报表模式,当你给定三个需要分组统计的字段(A,B,C),前者是

select count(*)  from   tb ------->group by A------>group by B ------->group by C  然后将几个结果集union all一下,后者则是通过类似选择排序的方式联合结果集(不理解的话,参考哥前面的随笔),这两种统计模式不够灵活。

所以Group by  Grouping sets就是一种足够灵活的方式,来获取我们想要的统计报表。

3、GROUP BY ,CUBE 或ROLLUP 中同时使用一列的处理

i、问题:在日常开发中可能会存在GROUP BY 或者GROUP BY CUBE 或者GROUP BY ROLLUP或者它们中组合使用到同一列的情况,那么就会出现重复的数据行,代码如下:

select orderid,productid,count(orderid) ordercount from test8 group by orderid,rollup(orderid,productid)

前面group by已经对orderid做了一次分组统计,后面rollup又对其做了一次分组统计,所以

出现了红框内的情况

ii、解决方案:

a、第一步:使用GROUP_ID()函数,这个函数的作用检索出每一个数据行在表中重复出现的次数,当然这个函数只在有GROUP BY或者GROUP BY ROLLUP 或者GROUP BY CUBE语句中的某一个存在的语句中可以使用,在其他语句中不能使用,代码如下:

select orderid,productid,GROUP_ID(),count(orderid) ordercount from test8 group by orderid,rollup(orderid,productid) 

GROUP_ID()方法显示红框内的两条数据重复出现了一次,那么这两条数据就需要过滤

b、下面使用HAVING(相当于where,但是having只能用于分组函数的数据过滤,只能用于包含group by的语句中) 来过滤重复的数据,代码如下:

select orderid,productid,GROUP_ID(),count(orderid) ordercount from test8 group by orderid,rollup(orderid,productid) HAVING GROUP_ID()=0

ok,数据成功过滤

转载于:https://www.cnblogs.com/GreenLeaves/p/6566409.html

使用group by rollup和group by cube后的辅助函数相关推荐

  1. group by rollup | cube 学习

    1.如果是ROLLUP(A, B, C)的话,首先会对(A.B.C)进行GROUP BY,然后对(A.B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作. ...

  2. mysql group by cube_SparkSQL 中group by、grouping sets、rollup和cube方法详解

    在平时的工作中,经常有按照不同维度筛选和统计数据的需求.拿视频会员订单数据来说吧,运营人员要查看深圳市的成功下单数或则深圳市某一种产品的成功下单数或者某一种产品的所有成功下单数时,每天的订单数又很大, ...

  3. group by rollup 和grouping的使用实例

    GROUPING函数可以接受一列,返回0或者1.如果列值为空,那么GROUPING()返回1:如果列值非空,那么返回0.GROUPING只能在使用ROLLUP或CUBE的查询中使用.当需要在返回空值的 ...

  4. group by rollup

    首先引用ITPUB上的总结: rollup(a,b,c)----------------> 从右到底递减汇总 ====>group by a,b,c   (减0次) UNION ALL = ...

  5. oracle按层级分组,oracle按照指定列分组合计group by rollup()

    group by rollup() 按分组合计 select grouping(status),status,owner,object_type,count(*) from dba_objects w ...

  6. Oracle 聚合实现小计、合计 (GROUP BY ROLLUP)

    1.先创建一个测试表 -- Create table 水果月销售记录表 create table C_FRUITS_SALES_RECORD_T (quarter VARCHAR2(20),--季度m ...

  7. ORACLE中每个分组后加个合计,最后总合计的GROUP BY rollup,和中文排序

    参考代码如下 SELECT LOCAL_NAME ,DEPT_DISTINGUISH_NAME ,SUM(TOTAL_PAY_SUM_R_LDC) TOTAL_PAY_SUM_R_LDC ,SUM(B ...

  8. postgre——case、union、小计总计(GROUP BY ROLLUP)写法

    //将几张不同表结构的数据全部合并在一起,使用了case.union,同时实现小计总计 //小计总计使用的 GROUP BY ROLLUP函数,GROUP BY ROLLUP使用双括号将字段括起来,是 ...

  9. 【kafka】kafka Group coordinator lookup for group

    1.概述 转载:添加链接描述 2.前因 今天在调应用的时候,email-service服务无法收发邮件. 看到这种问题,我先去查了一下email-service的日志,看到了kafka的一个报错: G ...

  10. Lasso回归系列四:Group Lasso,Sparse Group Lasso

    Lasso变体:Group Lasso,Sparse Group Lasso 关于Lasso回归的讲解可以看我的另一篇博客:Lasso回归系列二:Lasso回归/岭回归的原理 Group Lasso ...

最新文章

  1. java ee开发技术 上海大学_学院介绍
  2. 打开IT运维外包的“黑盒”
  3. VTK:绘图之PieChartActor
  4. JSP学习总结:2006
  5. 2016蓝桥杯省赛---java---B---2(生日蜡烛)
  6. 三年前端,面试思考(二)
  7. mysql 建立索引的例子_mysql建立合适的索引的例子
  8. 拳王虚拟项目公社:一款解除网站禁止复制的插件,Simple Allow Copy V 0.8.2
  9. springmvc前后端传值总结
  10. PICT-测试用例生成工具
  11. MikuMikuDance:渲染扩展《2》
  12. Invisible character on env file, cause programe abort abnormally
  13. JS技能点--日期时间格式化
  14. -XX:SurvivorRatio 命令解释
  15. esp8266搭建智能家居系统
  16. The AudioContext was not allowed to start. It must be resumed after a user gesture on the page
  17. Windows7/10耳机插入前面板没反应的解决方案
  18. java inet aton_IP处理函数inet_aton()和inet_ntoa()使用说明
  19. 周报 | 吉吉拍数字商品交易平台
  20. 理解LP Simplex

热门文章

  1. 《我也能做CTO之程序员职业规划》之十五:智商
  2. 二十一天学通VC++之创建工作者线程
  3. PyTorch:tensor-张量维度操作(拼接、维度扩展、压缩、转置、重复……)
  4. Pyinstaller将外部数据文件打包到可执行文件中(onefolder or onefile)教程
  5. vant组件做表格_vue实现简单表格组件
  6. 力扣-58 最后一个单词的长度
  7. Android 实现 相机、相册功能 + 图片存取数据库操作
  8. 第一次JAVA课,第一次课堂考,课后感受
  9. 理解vue中的父组件,子组件
  10. SQL Server 批量插入数据的两种方法 - 转