1、Oracle ROLLUP和CUBE 用法

Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。

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

如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 grouping_id()可以美化效果。除了使用GROUPING函数,还可以使用GROUPING_ID来标识GROUP BY的结果。

也可以 Group by Rollup(A,(B,C)) ,Group by A Rollup(B,C),…… 这样任意按自己想要的形式结合统计数据,非常方便。

2、实例

SQL>   select   grade,id,num   from   a;

GRADE             ID                                 NUM

----------   ----------   ----------

a                     1                                       1

a                     2                                       2

b                     3                                       4

b                     4                                       4

对grade字段进行rollup:

SQL>   select   grade,sum(num)   from   a   group   by   rollup(grade);

GRADE                 SUM(NUM)

----------   ----------

a                                       3

b                                       8

11

同时对grade和id字段进行rollup

SQL>   SELECT   decode(grouping_id(grade,ID),2,'小计',3,'合计',grade)   grade,

2                   decode(grouping_id(grade,ID),1,'小计',3,'合计',ID)   ID,

3                   SUM(num)

4     FROM   a   GROUP   BY   ROLLUP(grade,ID)

5     /

GRADE             ID                       SUM(NUM)

----------   ----------   ----------

a                     1                                       1

a                     2                                       2

a                     小计                                 3

b                     3                                       4

b                     4                                       4

b                     小计                                 8

合计               合计                               11

7   rows   selected

再看看先对grade分组,再对id进行rollup的情况:

SQL>   SELECT   grade,

2                   decode(GROUPING(ID),1,'合计',ID)   ID,

3                   SUM(num)

4     FROM   a   GROUP   BY   grade,rollup(ID)

5     /

GRADE             ID                       SUM(NUM)

----------   ----------   ----------

a                     1                                       1

a                     2                                       2

a                     合计                                 3

b                     3                                       4

b                     4                                       4

b                     合计                                 8

6   rows   selected

这里GROUP   BY   grade,rollup(ID)跟你的理解应该很相近了,而且可以看出GROUP   BY   grade,rollup(ID)结果跟ROLLUP(grade,ID)很类似,只是少了最后1行总合计,但是也可以就看出rollup多个字段时并不是只有1个字段起作用的

可以认为你理解的是只对第一个字段的累计,跟GROUP   BY   grade,rollup(ID)的结果很接近,再看rollup3个字段的情况:

SQL>   select   part,grade,id,num   from   a;

PART   GRADE             ID                                 NUM

----   ----------   ----------   ----------

p1       a                     1                                       1

p1       a                     2                                       2

p1       b                     3                                       3

p1       b                     4                                       4

p2       c                     5                                       5

p2       d                     6                                       6

6   rows   selected

SQL>

SQL>   SELECT   decode(grouping_id(part,grade,ID),7,'总计',part)   part,

2                   decode(grouping_id(part,grade,ID),3,'小计',7,'总计',grade)   grade,

3                   decode(grouping_id(part,grade,ID),1,'小计',3,'小计',7,'总计',ID)   ID,

4                   SUM(num)

5     FROM   a   GROUP   BY   ROLLUP(part,grade,ID)

6     /

PART   GRADE             ID                       SUM(NUM)

----   ----------   ----------   ----------

p1       a                     1                                       1

p1       a                     2                                       2

p1       a                     小计                                 3

p1       b                     3                                       3

p1       b                     4                                       4

p1       b                     小计                                 7

p1       小计               小计                               10

p2       c                     5                                       5

p2       c                     小计                                 5

p2       d                     6                                       6

p2       d                     小计                                 6

p2       小计               小计                               11

总计   总计               总计                               21

13   rows   selected

这里不光只对第一个字段做了累计,先按(part,grade,ID)分组累计,然后按(part,grade)分组累计,再按(part)分组累计,最后累计全部

再看看rollup   和   cube的区别:

对于ROLLUP(part,grade,ID),grouping_id(part,grade,ID)的值范围在(0,1,3,7)间即

part,grade,ID(作为合计时计为1)

0,0,0

0,0,1

0,1,1

1,1,1

而对于cube(part,grade,ID),grouping_id(part,grade,ID)的值范围在0-7之间即

part,grade,ID(作为合计时计为1)

0,0,0

0,0,1

0,1,0

0,1,1

1,0,0

1,0,1

1,1,0

oracle cube排序,Oracle rollup cube 用法相关推荐

  1. [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

    原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...

  2. oracle cube排序,Oracle命令CUBE

    Oracle基本命令:GROUP BY CUBE(字段列表):CUBE命令根据字段列表,生成不同的排列组合,并根据每一种组合结果,生成统计汇总.比 Oracle基本命令:GROUP BY CUBE(字 ...

  3. oracle进行排序,oracle排序的几种方法

    1.创建数据库表 CREATE TABLE USER_INFO ( USERID      VARCHAR2(10 BYTE)                 NOT NULL, USERNAME   ...

  4. oracle listagg 排序,oracle 行转列 listagg与wm_concat

    wm_concat 和listagg 函数都可以实现对(单个或组合)列的合并,也可以看成是对某一列的"SUM",这俩个函数功能相同,listagg是在11.2的版本中才首次出现的, ...

  5. oracle 二级排序,Oracle基础(二)之排序(order by)、限定查询(where)

    一.排序 1.使用order by关键字 放在select子句最后面 2.升序ASC  默认为升序 降序DESC 3.order by 需要排序的字段 排序规则 4.order by 后可以跟字段也可 ...

  6. oracle rollup 排序,Oracle分组函数之ROLLUP用法

    rollup函数 本博客简单介绍一下oracle分组函数之rollup的用法,rollup函数常用于分组统计,也是属于oracle分析函数的一种 环境准备 create table dept as s ...

  7. oracle分类函数总结,Oracle分组函数之ROLLUP的基本用法

    rollup函数 本博客简单介绍一下oracle分组函数之rollup的用法,rollup函数常用于分组统计,也是属于oracle分析函数的一种 环境准备 create table dept as s ...

  8. oracle字符串排序

    oracle字符串排序 oracle字符串排序 oracle字符串数字部分排序 oracle字符串排序 select * from table order by to_number(id) oracl ...

  9. 【转】【CUBE】Oracle分组函数之CUBE魅力

    [转][CUBE]Oracle分组函数之CUBE魅力 http://blog.itpub.net/519536/viewspace-610997/ Oracle的CUBE与ROLLUP功能很相似,也是 ...

最新文章

  1. hdu 1312 Red and Black 解题报告
  2. BootStrap 智能表单系列 五 表单依赖插件处理
  3. linux 爬虫工具,技术|如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy
  4. 成功解决SQL Server软件中出现的18456问题
  5. Python 计算机视觉(五)—— OpenCV 进行图像几何变换
  6. ProtoBuf在使用protoc进行编译时提示: Required fields are not allowed in proto3
  7. 通过History Trends Unlimited通过统计服务器上Chrome浏览器Top10网页历史访问量(2021.11.23)
  8. s1机试补考补习 9206
  9. 如何理解《瓦尔登湖》?
  10. Elasticsearch实践(二)linux安装
  11. MVVM 自动生成编号
  12. 电话系统服务器,局域网电话系统的两种解决方案——是否需要I
  13. python response重头开始_用 Python 抓取公号文章保存成 PDF
  14. iText和flying saucer结合生成pdf--显示分页页码
  15. Spring 注解配置(2)——@Autowired
  16. 操作系统 内存分配-分区
  17. 《系统工程理论与实践》Latex 模板使用教程
  18. 基于Hololens开发---本地化空间锚点
  19. 区块链技术及其在信息安全领域的研究进展 简单概括
  20. 基于unity3D的趣味桌球游戏开发

热门文章

  1. 12c oracle 修改内存_Oracle12c中性能优化功能增强新特性之重大突破——内存列存储新特性...
  2. ai作文批改_英语写作怎么提升?讯飞智能学习机AI作文批改带你实战练习
  3. 根据title 关闭cmd 窗口_2种Win7关闭休眠功能方法
  4. Selenium3自动化测试——4. 获取百度备案信息
  5. Mysql备机复制到主机_mysql主从复制的实现
  6. 简书python自动化运维_简明Python开发教程(4):网络自动化运维的曙光
  7. HTML自动换页相册,html版电子相册翻书特效
  8. java和c++的区别大吗_安徽成人高考和自考区别大吗?为什么推荐选成人高考?
  9. 【Spring注解驱动开发】自学java和三大框架要多久
  10. java读取pdf文件流,系列篇