【转】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语句性能上要好很多,不过不够干脆,还是需要先生 ...
随机推荐
- 1526. Martian Plates
http://acm.timus.ru/problem.aspx?space=1&num=1526 题目大意: 可以从n个碟子中任选一个放在桌子上(不断往上放),也可以把桌子上最顶端的盘子拿走 ...
- 聊聊css hack
什么是CSS hack CSS hack由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如 ...
- NOIP2016之反面教材提供
NOIP 2016信息竞赛总结 竞赛历程总结: 算下来一共学了11个月的信息竞赛,从最初进来的时候大概会一点最最基础的语法,上课什么也听不懂,然后一直追进度,我想在这个阶段中我的问题主要是自己知道自己 ...
- Django的单元测试
1.单元测试框架 django-unittest https://docs.djangoproject.com/en/1.9/topics/testing/overview/#speeding-up- ...
- java JVM
1.ClassLoader(类加载器) 1.加载:查找并加载类的二进制数据 2.连接 —验证:确保被加载的类的正确性(防止不是通过java命令生成的class文件被加载) —准备:为类的静态变量分配内 ...
- php 常用数组操作
php常用的数组操作函数,包括数组的赋值.拆分.合并.计算.添加.删除.查询.判断.排序等 array_combine 功能:用一个数组的值作为新数组的键名,另一个数组的值作为新数组的值 <?p ...
- post和get请求
get请求:不安全,参数在url地址中的参数的长度不能大于1024字节 post请求:安全,参数都是凤凰族昂在data里的,参数长度不限
- SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
1.查询数据库中的所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查询某个数据库中所有的表名: SELECT Name FR ...
- CI关于自动加载
/application/config/autoload.php文件中定义自动加载的包.类库.helper.用户配置文件.语言文件.模块 类库会到/application/libraries目录或/s ...
- html之页面元素印射
首先我遇到了一个问题,尽管不是搞前端开发的但事情交到了我这里就有必要去解决. 而这个问题就是我在这边文本框输入的内容要显示在另一个文本框中其实也是非常简单.但是对于初出茅庐的新手来说就有可能会难倒他. ...