【转】rollup、cub、grouping sets、grouping、grouping_id在报表中的应用
摘自 http://blog.itpub.net/26977915/viewspace-734114/
在报表语句中经常要使用各种分组汇总,rollup和cube就是常用的分组汇总方式。
第一:group by rollup
1、如果使用诸如group by rollup(A,B,C)的方式分组,那么返回的分组结果是
(A,B,C) (A,B) (A) (NULL) 一共四种结果。即从右到左递减,最后来个合计。
例如:
SQL> select * from t;
YEARS MONTHS PRODUCT_NA SALES
---------- ---------- ---------- ----------
2008 1 A 1000
2008 1 B 1500
2008 2 A 2000
2008 2 B 3000
2008 2 C 1000
2008 3 A 3000
已选择6行。
SQL> select years,months,product_name,sum(sales) sum_sales from t
2 group by rollup(years,months,product_name)
3 /
YEARS MONTHS PRODUCT_NA SUM_SALES
---------- ---------- ---------- ----------
2008 1 A 1000 ----------group by (years,months,product_name)
2008 1 B 1500
2008 1 2500 ----------group by (years,months)
2008 2 A 2000
2008 2 B 3000
2008 2 C 1000
2008 2 6000 ----------group by (years,months)
2008 3 A 3000
2008 3 3000 ----------group by (years,months)
2008 11500 ----------group by (years)
11500 ----------group by (NULL)
已选择11行。
2、如果使用诸如group by A,ROLLUP(B,C) 那么返回的分组方式是:
(A,B,C) (A,B) (A,NULL) 及在这种情况下,先计算rollup里面的分组情况,再与A组合。
例如:
SQL> select years,months,product_name,sum(sales) sum_sales from t
2 group by years,rollup(months,product_name)
3 /
YEARS MONTHS PRODUCT_NA SUM_SALES
---------- ---------- ---------- ----------
2008 1 A 1000 ----------group by (years,months,product_name)
2008 1 B 1500
2008 1 2500 ----------group by (years,months)
2008 2 A 2000
2008 2 B 3000
2008 2 C 1000
2008 2 6000
2008 3 A 3000
2008 3 3000
2008 11500 ----------group by (years)
已选择10行。
第二:group by cube
1、如果使用诸如cube(A,B,C)的方式,那么返回的分组组合是
(A) (A,B) (A,C) (A,B,C) (B) (B,C) (C) (null) 共8种组合方式
例如:
SQL> select years,months,product_name,sum(sales) sum_sales from t
2 group by cube(years,months,product_name)
3 /
YEARS MONTHS PRODUCT_NA SUM_SALES
---------- ---------- ---------- ----------
11500 ----------group by (null)
A 6000 ----------group by (product_name)
B 4500
C 1000
1 2500
1 A 1000
1 B 1500
2 6000
2 A 2000
2 B 3000
2 C 1000
3 3000 ----------group by (months)
3 A 3000 ----------group by (months,product_name)
2008 11500 ----------group by (years)
2008 A 6000
2008 B 4500
2008 C 1000 ----------group by (years,product_name)
2008 1 2500
2008 1 A 1000
2008 1 B 1500
2008 2 6000
2008 2 A 2000
2008 2 B 3000
2008 2 C 1000
2008 3 3000 ----------group by (years,months)
2008 3 A 3000 ----------group by (years,months,product_name)
已选择26行。
2、如果使用GROUP BY A,CUBE(B,C),那么返回的分组组合为:
(A,B) (A,B,C) (A,C) (A)
例如:
SQL> select years,months,product_name,sum(sales) sum_sales from t
2 group by years,cube(months,product_name)
3 /
YEARS MONTHS PRODUCT_NA SUM_SALES
---------- ---------- ---------- ----------
2008 11500 ----------group by (years)
2008 A 6000 ----------group by (years,product_name)
2008 B 4500
2008 C 1000
2008 1 2500 ----------group by (years,months)
2008 1 A 1000 ----------group by (years,months,product_name)
2008 1 B 1500
2008 2 6000
2008 2 A 2000
2008 2 B 3000
2008 2 C 1000
2008 3 3000
2008 3 A 3000
已选择13行。
3、如果使用GROUP BY A,ROLLUP(B,C),CUBE(D,E),那么返回的分组组合为:
先分解cube:
a,rollup(b,c),d,e
a,rollup(b,c),d
a,rollup(b,c),e
a,rollup(b,c)
再分解ROLLUP而得到最终所有情况为:
a,b,c,d,e
a,b,d,e
a,d,e
a,b,c,d
a,b,d
a,d
a,b,c,e
a,b,e
a,e
a,b,c
a,b
a
例如:
SQL> select years,months,product_name,sum(sales) sum_sales from t
2 group by years,rollup(months),cube(product_name)
3 /
YEARS MONTHS PRODUCT_NA SUM_SALES
---------- ---------- ---------- ----------
2008 1 A 1000 ----------group by (years,months,product_name)
2008 2 A 2000
2008 3 A 3000
2008 1 B 1500
2008 2 B 3000
2008 2 C 1000
2008 A 6000 ----------group by (years,product_name)
2008 B 4500
2008 C 1000
2008 1 2500 ----------group by (years,product_name)
2008 2 6000
2008 3 3000
2008 11500 ----------group by (years)
已选择13行。
第三:grouping sets
如果使用group by A,grouping sets(B,C) 那么相当于group by A,B UNION ALL group by A,C
例如:
SQL> select years,months,product_name,sum(sales) sum_sales from t
2 group by years,grouping sets(months,product_name)
3 /
YEARS MONTHS PRODUCT_NA SUM_SALES
---------- ---------- ---------- ----------
2008 2 6000 ----------group by (years,months)
2008 1 2500
2008 3 3000
2008 B 4500 ----------group by (years,product_name)
2008 C 1000
2008 A 6000
已选择6行。
-----------------------------------------------------------------------------------------------------------------华丽的分割线!
现实中可能希望出现小计、合计等字样的报表,那么可以使用grouping函数来达到美化的效果!
第三:grouping(exp),当没有对exp分组汇总时,便返回1;
例如:
SQL> select months,product_name,sum(sales) sum_sales,grouping(product_name) from t
2 group by rollup(months,product_name)
3 /
MONTHS PRODUCT_NA SUM_SALES GROUPING(PRODUCT_NAME)
---------- ---------- ---------- ----------------------
1 A 1000 0 ----------group by (months,product_name)
1 B 1500 0
1 2500 1 ----------group by (months)
2 A 2000 0
2 B 3000 0
2 C 1000 0
2 6000 1 ----------group by (months)
3 A 3000 0
3 3000 1 ----------group by (months)
11500 1 ----------group by (null)
已选择10行。
第四:GROUPING_ID(exp1,exp2,…,expN)={GROUPING(exp1)||GROUPING(exp2)||…||GROUPING(expN)}变成十进制数,如:
如果GROUPING(A)=1,GROUPING(B)=0,GROUPING(C)=1,那么
GROUPING_ID(A,B,C) = [101]二进制 = 5,
GROUPING_ID(B,A,C) = [011]二进制 = 3.
例如:
SQL> select years,months,product_name,sum(sales) sum_sales,grouping_id(years,months,product_name) g_id from t
2 group by rollup(years,months,product_name)
3 /
YEARS MONTHS PRODUCT_NA SUM_SALES G_ID
---------- ---------- ---------- ---------- ----------
2008 1 A 1000 0
2008 1 B 1500 0
2008 1 2500 1 ----------group by (years,months) 001=1
2008 2 A 2000 0
2008 2 B 3000 0
2008 2 C 1000 0
2008 2 6000 1
2008 3 A 3000 0
2008 3 3000 1
2008 11500 3 ----------group by (years) 011=3
11500 7 ----------group by (null) 111=7
已选择11行。
了解了grouping和grouping_id函数后,便可以结合decode函数来生成小计合计的效果了;
SQL> select decode(grouping(months)+grouping(product_name),1,'月份小计',2,'合计:',months) months,
2 product_name,sum(sales) sum_sales from t
3 group by rollup(months,product_name)
4 /
MONTHS PRODUCT_NA SUM_SALES
---------------------------------------- ---------- ----------
1 A 1000
1 B 1500
月份小计 2500
2 A 2000
2 B 3000
2 C 1000
月份小计 6000
3 A 3000
月份小计 3000
合计: 11500
已选择10行。
SQL> select decode(grouping_id(months,product_name),1,'月份小计:',2,'产品小计:',3,'合计:',months) months,
2 product_name,sum(sales) sum_sales from t
3 group by cube(months,product_name)
4 order by 2
5 /
MONTHS PRODUCT_NA SUM_SALES
---------------------------------------- ---------- ----------
1 A 1000
2 A 2000
3 A 3000
产品小计: A 6000
1 B 1500
2 B 3000
产品小计: B 4500
2 C 1000
产品小计: C 1000
月份小计: 2500
月份小计: 6000
月份小计: 3000
合计: 11500
已选择13行。
点评:group by rollup、group by cube、grouping sets、grouping函数、grouping_id函数这些属于报表常用函数,要灵活运用!
【转】rollup、cub、grouping sets、grouping、grouping_id在报表中的应用的更多相关文章
- Oracle的rollup、cube、grouping sets函数
转载自:https://blog.csdn.net/huang_xw/article/details/6402396 Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollu ...
- Oracle中group by 的扩展函数rollup、cube、grouping sets
Oracle的group by除了基本使用方法以外,还有3种扩展使用方法,各自是rollup.cube.grouping sets.分别介绍例如以下: 1.rollup 对数据库表emp.如果当中两个 ...
- Hive函数:GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
参考:lxw大数据田地:http://lxw1234.com/archives/2015/04/193.htm 数据准备: CREATE EXTERNAL TABLE test_data ( mont ...
- Hive高级聚合GROUPING SETS,ROLLUP以及CUBE
scala> import org.apache.spark.sql.hive.HiveContextimport org.apache.spark.sql.hive.HiveContext s ...
- 解析数仓OLAP函数:ROLLUP、CUBE、GROUPING SETS
摘要:GaussDB(DWS) ROLLUP,CUBE,GROUPING SETS等OLAP函数的原理解析. 本文分享自华为云社区<GaussDB(DWS) OLAP函数浅析>,作者: D ...
- hive grouping sets 等聚合函数
函数说明: grouping sets 在一个 group by 查询中,根据不同的维度组合进行聚合,等价于将不同维度的 group by 结果集进行 union allcube 根据 group b ...
- 综合练习: PIVOT、UNPIVOT、GROUPING SETS、GROUPING_ID_1
综合练习: PIVOT.UNPIVOT.GROUPING SETS.GROUPING_ID 问题1:Desired output: empid cnt2007 cnt2008 cnt2009 ---- ...
- group by <grouping sets(...) ><cube(...)>
GROUP BY GROUPING SETS() 后面将还会写学习 with cube, with rollup,以及将它们转换为标准的GROUP BY的子句GROUP SET(), CU ...
- SQL Server ->> GROUPING SETS, CUBE, ROLLUP, GROUPING, GROUPING_ID
在我们制作报表的时候常常需要分组聚合.多组聚合和总合.如果通过另外的T-SQL语句来聚合难免性能太差.如果通过报表工具的聚合功能虽说比使用额外的T-SQL语句性能上要好很多,不过不够干脆,还是需要先生 ...
随机推荐
- PHP制作验证码
session_start();$a = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r',' ...
- MYSQL低权限读文件
技巧:Reading files in MySQL with file_priv = no. 当用户无权限调用load_file()函数的时候可以用以下方式读取文件内容: 1.建立test(不分配fi ...
- HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?
这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others) ...
- (BFS)aoj0558-Cheese
题目地址 根据题意,必须按从1吃到n的顺序.建立vi数组记录去没去过某一点,从起点向四周搜索,合法且未去过就入队列.每当找到符合此时应吃的位置,就将这个位置改为'.'并刷新vi数组,清空队列(因为必须 ...
- classpath路径和properties
在Java程序中,一般情况下使用绝对路径还是相对路径都不太合适,因为Java程序的jar包所放的位置不确定,执行java程序时当前的路径也不确定,所以不合适.一般在Java程序中我们会把资源放到cla ...
- Scipy学习笔记 矩阵计算
Scipy学习笔记 非本人原创 原链接 http://blog.sina.com.cn/s/blog_70586e000100moen.html 1.逆矩阵的求解 >>>impor ...
- Java String.split()小点
java String.split(); 别的不说,单说其中一个问题,这个函数去切分空字符串时,得到的结果: public static void main(String[] args) {// St ...
- java web学习之表单
前台页面与后台页面的数据又form表单完成. <form name ="form1" method="post" action="index ...
- JS 4 新特性:混合属性(mixins)之二
Mixins many classes[混合许多个类] 迄今为止,我们已经学会了简单的继承,我们还能够通过使用mixins处理机制来混合许多类.源于这种理念是非常简单的:我们能够把许多个类最终混合到一 ...
- HTML5 拖动
触发的事件有:dragstart事件.drag事件和dragend事件. 按下鼠标键并开始移动鼠标的时候,会在被拖拽的元素上触发dragstart事件.这时候光标变成”不能放”符号(圆环中有一条反斜线 ...