Oracle 中运用rollup和cube实现汇总运算

摘要:
前言,我读了很多关于汇总和立方体使用的文章和博客,发现了一个问题。其中许多是相同的或复制的,但这不是重点。重点是他们太专业了,他们直接给出了一个结论,而没有给出推断这个结论的整个过程。我个人觉得初学者不适合学习和使用这两个功能,我个人认为这篇文章更适合初学者学习和使用回滚和立方体。其中没有诸如“纬度”之类的关键字。

前言、看了很多的随笔博文内容都是关于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);

Oracle 中运用rollup和cube实现汇总运算第1张

以上是基础数据

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

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

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

Oracle 中运用rollup和cube实现汇总运算第2张

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

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

Oracle 中运用rollup和cube实现汇总运算第3张

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

a、

Oracle 中运用rollup和cube实现汇总运算第4张发现使用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;

Oracle 中运用rollup和cube实现汇总运算第5张

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

Oracle 中运用rollup和cube实现汇总运算第6张

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

a、

 Oracle 中运用rollup和cube实现汇总运算第7张和i一样,使用rollup对整个表进行了count(*)操作

b、

Oracle 中运用rollup和cube实现汇总运算第8张和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

Oracle 中运用rollup和cube实现汇总运算第9张

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

Oracle 中运用rollup和cube实现汇总运算第10张

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

a、

 Oracle 中运用rollup和cube实现汇总运算第11张和上面的一样,多出了select count(*) from test8

b、

Oracle 中运用rollup和cube实现汇总运算第12张和ii,使用rollup多做了一步group by(orderid)

c、

Oracle 中运用rollup和cube实现汇总运算第13张使用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) 

Oracle 中运用rollup和cube实现汇总运算第14张

 发现和上面使用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

Oracle 中运用rollup和cube实现汇总运算第15张

(2)group by cube

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

Oracle 中运用rollup和cube实现汇总运算第16张

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

a、

 Oracle 中运用rollup和cube实现汇总运算第17张和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;

Oracle 中运用rollup和cube实现汇总运算第18张

(2)group by cube

 Oracle 中运用rollup和cube实现汇总运算第19张

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

a、

Oracle 中运用rollup和cube实现汇总运算第20张group by cube 多了一次count(*) 操作

b、

Oracle 中运用rollup和cube实现汇总运算第21张group by cube 多了一次select orderid,count(orderid) from test8 group by orderid

c、

Oracle 中运用rollup和cube实现汇总运算第22张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;

Oracle 中运用rollup和cube实现汇总运算第23张

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

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和产品价格进行统计

Oracle 中运用rollup和cube实现汇总运算第24张

b、使用group by cube

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

Oracle 中运用rollup和cube实现汇总运算第25张

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(*)的操作,也就是全表的数量检索

免责声明:文章转载自《Oracle 中运用rollup和cube实现汇总运算》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java----面试题关于Qt5 UI设计的一些小知识下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle表(1)

对于我们初学者来说,对表的概念也有一定的认识。因为我们对数据库的操作,90%以上是对表的操作。 常见表的类型: 规则表(Regular table),严格意义上来说又叫heaptable(堆表),也就是我们最普通的一张表。partitiontable、Index-organizedtable、Cluster三种表类型,在讲解数据结构的时候有做过简单的描述,...

Delphi连接Oracle控件ODAC的安装及使用

Delphi ODAC 控件下载 ODAC 64位客户端 12.1.0.2.4 http://down-ww3.7down.net/pcdown/soft/xiazai/odac-x64.rar Delphi连接Oracle有很多种方式,但大多要在客户机上安装Oracle那庞大的客户端,比较不方便,使用ODAC控件连接Oracle则免去了这些麻烦。ODAC...

创建oracle数据库时,出现ORA-00922: 选项缺失或无效

sdd53HOME 新建oracle数据库时遇到ORA-00922: 选项缺失或无效的问题,如图: 原因:一般是语句的语法有问题。比如命名不对,关键字写错等等。对于非标准的命名,一般采用双引号来创建。 具体原因:就是开始的用户密码的设置不符合规则,当时并不会报出。解决办法:标识符命名规则:1、必须以字母开始。2、长度不能超过30个单字节字符。3、只能包括...

Oracle SQLCODE/SQLERRM

Oracle内置函数SQLCODE和SQLERRM是特别用在OTHERS处理器中,分别用来返回Oracle的错误代码和错误消息。OTHERS处理器应该是异常处理块中的最后的异常处理器,因为它是用来捕获除了别的异常处理器处理以外的所有的Oracle异常,所以在程序的最外层使用一个OTHERS处理器的话,将可以确保所有的错误都会被检测到。在一个内在的异常中,S...

Linq之关键字基本查询

子句 说明 from 指定数据源和范围变量(类似于迭代变量)。 where 根据一个或多个由逻辑“与”和逻辑“或”运算符(&& 或 ||)分隔的布尔表达式筛选源元素。 select 指定当执行查询时返回的序列中的元素将具有的类型和形式。 group 按照指定的键值对查询结果进行分组。...

纯js遍历json获取值动态为select添加option

遍历json数组 并动态为select添加option 直接上代码,重要部分有注解 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="widt...