前言、看了很多的随笔博文内容都是关于rollup和cube的用法,发现一个问题,很多都是一样或者转载的,但这都不是重点,重点是,他们写的都太专业化了,直接给一个结论,并没有给出整个推理出这个结论的过程,个人感觉不太适合新手学习并使用这两个函数,下面我这篇随笔个人觉得比较适合新手学习和使用rollup和cube,里面没有什么"纬度"之类的关键字。下面开始!!!!!

一、group by  rollup函数解析

1、对于数据的汇总,是数据库经常用到的任务之一,本文讲的就是其中的一种rollup和cube实现数据汇总

2、实例讲解

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);

以上是基础数据

i、现在我们有个需求,需要统计出每个订单的产品数量

(1)用group by的解决方法如下

select ORDERID,count(ID) as ordercount from test8 group by ORDERID;

(2)用rollup的解决方案如下:

select ORDERID,count(ID) as ordercount from test8 group by  rollup(ORDERID);

总结分析:我们来看使用rollup的结果集相较于group by多出了哪些结果

a、

发现使用rollup多做了一步select count(*) from test8的操作

ii、需求改变,现在需要求出每个订单下每个产品的订单数

(1)group by解决方法:

select ORDERID,productid,count(ID) as ordercount from test8 group by ORDERID,productid order by orderid;

(2)rollup解决方案:

select nvl(TO_CHAR(ORDERID),'null') ORDERID,nvl(TO_CHAR(productid),'null') productid,count(id) as ordercount from test8 group by rollup(ORDERID,productid) order by orderid;

总结分析:和i中的一样分析,我们来看使用rollup的结果集相较于group by多出了哪些结果

a、

和i一样,使用rollup对整个表进行了count(*)操作

b、

和i不同的是:通过和group by比较发现使用rollup语句,其多做了一步group by(orderid)的操作

iii、需求改变,又变复杂了,我们需要统计出不同价格产品的订单情况,这里问题有点抽象,实在不理解可以看下面的代码:

(1)group by解决方案

select orderid,productid,price,count(ID),sum(price*quantity) as total from test8
group by orderid,productid,price order by ORDERID

(2)rollup解决方案

select orderid,nvl(TO_CHAR(productid),'null') productid,nvl(TO_CHAR(price),'null') price ,count(ID),sum(price*quantity) as total from test8
group by rollup(orderid,productid,price) order by ORDERID;

结果分析:观察这次的结果,相比上面的结果多出了什么结果记录

a、

和上面的一样,多出了select count(*) from test8

b、

和ii,使用rollup多做了一步group by(orderid)

c、

使用rollup,其多做了一步group by(orderid,productid)

做到这一步,有了个怎样的猜想,于试之,代码如下:

select null orderid,null productid,null price,count(*),sum(price*quantity) from test8
UNION
select orderid,null productid,null price,count(id),sum(price*quantity) from test8 group by(orderid)
UNION
select orderid,productid,null price,count(id),sum(price*quantity)  from test8 group by(orderid,productid)
UNION 
select orderid,productid,price,count(id),sum(price*quantity) from test8 group by(orderid,productid,price) 

发现和上面使用rollup的语句所实现的结果集一模一样!

3、使用rollup的总结

通过3的实例,大致可以得出以下的结论

select orderId,productID,price,count(*)  from Test8 group by  rollup(orderId,productID,price)

等同于

select null orderId,null productID,null price,count(*) from Test8

UNION

select orderId,null productID,null price,count(*) from Test8 group by(orderId)

UNION

select orderId,productID,null price,count(*) from Test8 group by(orderId,productID)

UNION

select orderId,productID,price,count(*) from Test8 group by(orderId,productID,price)

优点:减少代码量,目前我只知道这个!!!哈哈

二、group by cube  函数解析               group by cube也是一样的分析方法,分析使用group by cube的数据和group by之间的差别.

i、现在我们有个需求,需要统计出每个订单的产品数量

(1)group by处理

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

(2)group by cube

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

结果分析:观察这次的结果,相比group by和group by cube间的结果差异

a、

和group  by相比group by cube多了一次select count(*)操作

ii、需求改变,现在需要求出每个订单下每个产品的订单数

(1)group by处理

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

(2)group by cube

结果分析:观察这次的结果,相比group by和group by cube间的结果差异

a、

group by cube 多了一次count(*) 操作

b、

group by cube 多了一次select orderid,count(orderid) from test8 group by orderid

c、

group by cube多了一次select null orderid,productid,count(productid) productcount from test8 group by productid order by productid;

iii、需求改变,又变复杂了,我们需要统计出不同价格产品的订单情况,这里问题有点抽象,实在不理解可以看下面的代码:

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

根据上面的总结分析,下面来推测结果

a、推测结果

select orderid,productid,CAST(price AS NUMBER (10, 2))  from
(select  null orderid,null productid,null price,count(*) from test8   --1、做一次总定订单数的统计
UNION
select orderid,null productid,null price,count(orderid) from test8 group by orderid   --2、按照订单id进行分组统计
UNION
select null orderid,productid,null price,count(orderid) from test8 group by productid   --3、按照产品id进行分组统计
UNION
select null orderid,null productid,price,count(orderid) from test8 group by price   --4、按照产品价格进行分组统计
UNION
select orderid,productid,null price,count(orderid) from test8 group by orderid,productid   --5、按照订单id和产品id进行统计
UNION
select orderid,null productid,price,count(orderid) from test8 group by orderid,price   --6、按照订单id和产品价格进行统计
UNION
select null orderid,productid,price,count(orderid) from test8 group by productid,price   --7、按照产品id和产品价格进行统计
UNION
select  orderid,productid,price,count(orderid) from test8 group by orderid,productid,price)  --8、按照订单id和产品id和产品价格进行统计

b、使用group by cube

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

ok、推论正确

三、终极总结

1、关于group by rollup和group by cube这两个方法玩到现在,下面是个人觉得的优点:

a、减少代码量   这点毋庸置疑,完成同样的报表统计使用UNION要多太多代码了,如果报表足够大,使用UNION的话,我反正无法想象得些多少代码

b、适合进行报表分析

暂时就知道这两个!!!智商有限!!!

2、关于这两个方法的不同点

a、

GROUP BY ROLLUP(A,B,C),看这条语句怎么做的group by(a)  union group by(a,b)    union group by(a,b,c) 也就是a----a,b-------a,b,c

b、

在看GROUP BY CUBE(A,B,C),在看这条语句是怎么做的group by(a) union group by(b) union group by(c) union group by(a,b) union group by(a,c) union group by(b,c)

union group by(a,b,c) 这个很强大,它会对cube()内部的字段的每一种情况都进行group by统计,有点类似选择排序,但是rollup只会进行线性的比较

3、相同点

都会进行select count(*)的操作,也就是全表的数量检索

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

Oracle 中运用rollup和cube实现汇总运算相关推荐

  1. day02: SQL_DML, oracle中sql的各种查询

    1.oraclesql的特性 pLsql显示: 修改显示的格式 SQL> set pagesize 300; SQL> set linesize 300; SQL> select e ...

  2. oracle group by 两项,Oracle中group by 的扩展函数rollup、cube、grouping sets

    Oracle的group by除了基本使用方法以外,还有3种扩展使用方法,各自是rollup.cube.grouping sets.分别介绍例如以下: 1.rollup 对数据库表emp.如果当中两个 ...

  3. oracle中的roll up,oracle  group by 与roll up,cube,grouping sets,grouping_id联合使用

    Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollup.cube.grouping sets. 1 rollup 假设有一个表test,有A.B.C.D.E5列. 如果使 ...

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

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

  5. oracle 分组统计效率,Oracle 分组求和函数(rollup、cube、grouping sets)

    文章目录 1 场景 1.1 概念 1.2 思维导图 1.3 数据准备 2 知识点小结 2.1 group by 2.2 grouping sets:单独分组 2.3 rollup:累计累加 2.4 c ...

  6. oracle rollup 合计,oracle中关于分组合计函数rollup使用

    常见的报表制作过程中需要对相关分组条件进行分组合计,若借助第三方工具可以很容易实现,但在oracle中提供了现成的rollup函数来帮助我们实现按条件分组合计功能. 例:若要按品牌和商品名称进行分组, ...

  7. oracle中命令,oracle中常用命令汇总(一)

    1.如何查看Oracle的数据库sid名称? 如果用sysdba身份登录.执行以下命令: SQL> conn / as sysdba; 已连接. SQL> select name from ...

  8. mysql聚合函数rollup和cube

    转:https://blog.csdn.net/liuxiao723846/article/details/48970443 一.with rollup: with rollup 通常和group b ...

  9. mysql支持cube_mysql聚合函数rollup和cube

    一.with rollup: with rollup通常和group by语句一起使用,是根据维度在分组的结果集中进行聚合操作.--对group by的分组进行汇总. 假设用户需要对N个纬度进行聚合查 ...

最新文章

  1. python条件表达式:多项分支,双向分支
  2. Java基础之String深入解析
  3. docker查看命令帮助手册
  4. android launcher主要功能_Android 或有新变化,语音搜索进一步强化
  5. System 中的数学函数
  6. android trace获取和分析
  7. Tapestry5之页面显示
  8. 下载谷歌瓦片地图并拼接为高清大图
  9. 鸭子应用--策略模式
  10. updating mysql.pid_MySQL启动报错-The server quit without updating PID file[FAILED]mysql/mysql.pid)...
  11. 怎么制作你的第一个机器人
  12. 微信为什么收不到服务器的红包,收不到别人的微信红包是怎么回事?该怎么办?...
  13. 关于VM虚拟机一启动就会使电脑重启的问题
  14. ElasticSearch深入浅出
  15. 《C语言程序设计》笔记
  16. Lync问题解决之在Lync客户端中,无法查看到聊天记录
  17. 详解设置路由导航的两种方法
  18. 程序员年薪20万、30万、40万都是什么样的体验?
  19. 用map代替双重for循环,stream流代替双重for循环
  20. linux版本的xmind怎么安装教程,Linux下安装脑图软件XMind的步骤

热门文章

  1. 测试你的样子长得美与丑「超准的测试」
  2. GitHub热榜第四!这套Python机器学习课,免费获取还易吸收 | 资源
  3. DeepMind作弊?被质疑干翻星际2顶尖高手全靠手速
  4. 奇怪的拍立得,按下快门,你就被AI变成一张简笔涂鸦 | 补童年·有代码
  5. 解密亚马逊Ironman计划:背靠AWS云服务发力AI,对抗谷歌微软
  6. webpack打包原理(待续)
  7. 学习笔记--Python多进程
  8. windows server疑难杂症
  9. VBS去除指定的字符串中的重复项返回重复后的字符串
  10. JDK+MyEclipse+Tomcat的配置(修改Tomcat 6.x的端口)