相关文章推荐
坚强的机器猫  ·  OBS推流 rtmp服务器(docker) ...·  1 年前    · 
豁达的便当  ·  对象存储MinIO的简介与部署_51CTO博 ...·  1 年前    · 
高大的毛衣  ·  python从数据库导出数据到表-掘金·  1 年前    · 
狂野的毛豆  ·  mysql和mongo混合使用_MySQL和 ...·  1 年前    · 
伤情的肉夹馍  ·  scrollIntoView ...·  1 年前    · 
小百科  ›  使用group by rollup和group by cube后的辅助函数开发者社区
cube
谦和的牛排
1 年前
郑小超.

使用group by rollup和group by cube后的辅助函数

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
郑小超.
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 使用group by rollup和group by cube后的辅助函数

使用group by rollup和group by cube后的辅助函数

作者头像
郑小超.
发布 于 2018-01-24 16:56:39
1.7K 0
发布 于 2018-01-24 16:56:39
举报
文章被收录于专栏: GreenLeaves GreenLeaves

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

代码语言: javascript
复制
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后的结果集)中的空值。

代码语言: javascript
复制
select orderid,productid,count(orderid) ordercount from test8 group by cube(orderid,productid) order by orderid;

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

代码语言: javascript
复制
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值修改为任何字段名类型的值了,代码如下:

代码语言: javascript
复制
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解决方法:

代码语言: javascript
复制
select orderid,productid,count(orderid) from test8 group by (orderid,productid) order by orderid 

(2)group by grouping sets解决方案

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

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

代码语言: javascript
复制
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的合集,

下面验证猜想:

代码语言: javascript
复制
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)

代码语言: javascript
复制
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的集合

代码语言: javascript
复制
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维的。

代码语言: javascript
复制
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  

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

代码语言: javascript
复制
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  
 
推荐文章
坚强的机器猫  ·  OBS推流 rtmp服务器(docker) python opencv拉流_docker推流_XhranXhran的博客-CSDN博客
1 年前
豁达的便当  ·  对象存储MinIO的简介与部署_51CTO博客_minio对象存储
1 年前
高大的毛衣  ·  python从数据库导出数据到表-掘金
1 年前
狂野的毛豆  ·  mysql和mongo混合使用_MySQL和Mongodb在一个应用程序中的混合_weixin_39629679的博客-CSDN博客
1 年前
伤情的肉夹馍  ·  scrollIntoView 失效调研与替换方案 - 掘金
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号