【转】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语句性能上要好很多,不过不够干脆,还是需要先生 ...
随机推荐
- windows内核编程 白话设备栈
在ntddk.h中定义了该函数原型: #if (NTDDI_VERSION >= NTDDI_WINXP) NTKERNELAPI NTSTATUS IoAttachDeviceToDevice ...
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C.Ray Tracing (模拟或扩展欧几里得)
http://codeforces.com/contest/724/problem/C 题目大意: 在一个n*m的盒子里,从(0,0)射出一条每秒位移为(1,1)的射线,遵从反射定律,给出k个点,求射 ...
- python 打印 网格
#/usr/bin/python # -*- coding:utf-8 -*- # width 单个网格有多少个 - 宽度# height 单个网格有多少个 | 高度# lateral 横向有多少个网 ...
- Socket Receive 避免 Blocking
我们知道 Socket Blocking 属性默认true . 表明Socket 处于同步调用 , Connect , 或 Send , Receive 需等待动作 完成才能继续执行. 有一种应用场景 ...
- python取文件最后几行
with open("text.txt") as f: txt=f.readlines() keys=[k for k in range(0,len(txt))] resu ...
- c/c++常用网址
个人主页Dennis Ritchie's home pagehttp://cm.bell-labs.com/cm/cs/who/dmr/index.html Brian Kernighan's hom ...
- x-forward-for详解
转载:http://www.360doc.com/content/14/0110/17/15459414_344165975.shtml 如今利用nginx做负载均衡的实例已经很多了,针对不同的应用场 ...
- NGUI如何使2D图片按像素1:1显示在屏幕上
NGUI版本为3.5.1. 将camera 设置为正交模式,size值设为1. UIRoot(2D)有3种缩放样式: 1.PixelPerfect.UI严格按照指定的像素大小显示,不会随着屏幕的分辨率 ...
- JXL操作Excel
jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可 供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文 ...
- MyEclipse 10.7.1 最新版官网下载地址
MyEclipse 10.7.1(Windows): http://downloads.myeclipseide.com/downloads/products/eworkbench/indigo/in ...