摘自 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在报表中的应用的更多相关文章

  1. Oracle的rollup、cube、grouping sets函数

    转载自:https://blog.csdn.net/huang_xw/article/details/6402396 Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollu ...

  2. Oracle中group by 的扩展函数rollup、cube、grouping sets

    Oracle的group by除了基本使用方法以外,还有3种扩展使用方法,各自是rollup.cube.grouping sets.分别介绍例如以下: 1.rollup 对数据库表emp.如果当中两个 ...

  3. Hive函数:GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

    参考:lxw大数据田地:http://lxw1234.com/archives/2015/04/193.htm 数据准备: CREATE EXTERNAL TABLE test_data ( mont ...

  4. Hive高级聚合GROUPING SETS,ROLLUP以及CUBE

    scala> import org.apache.spark.sql.hive.HiveContextimport org.apache.spark.sql.hive.HiveContext s ...

  5. 解析数仓OLAP函数:ROLLUP、CUBE、GROUPING SETS

    摘要:GaussDB(DWS) ROLLUP,CUBE,GROUPING SETS等OLAP函数的原理解析. 本文分享自华为云社区<GaussDB(DWS) OLAP函数浅析>,作者: D ...

  6. hive grouping sets 等聚合函数

    函数说明: grouping sets 在一个 group by 查询中,根据不同的维度组合进行聚合,等价于将不同维度的 group by 结果集进行 union allcube 根据 group b ...

  7. 综合练习: PIVOT、UNPIVOT、GROUPING SETS、GROUPING_ID_1

    综合练习: PIVOT.UNPIVOT.GROUPING SETS.GROUPING_ID 问题1:Desired output: empid cnt2007 cnt2008 cnt2009 ---- ...

  8. group by <grouping sets(...) ><cube(...)>

    GROUP BY      GROUPING SETS() 后面将还会写学习 with cube,  with rollup,以及将它们转换为标准的GROUP BY的子句GROUP SET(), CU ...

  9. SQL Server ->> GROUPING SETS, CUBE, ROLLUP, GROUPING, GROUPING_ID

    在我们制作报表的时候常常需要分组聚合.多组聚合和总合.如果通过另外的T-SQL语句来聚合难免性能太差.如果通过报表工具的聚合功能虽说比使用额外的T-SQL语句性能上要好很多,不过不够干脆,还是需要先生 ...

随机推荐

  1. href链接的地址

    tencent://message/?uin=QQ号. 链接一个弹出框.指向一个QQ号.

  2. 计算机网络(13)-----java nio手动实现简单的http服务器

    java nio手动实现简单的http服务器  需求分析 最近在学习HTTP协议,还是希望动手去做一做,所以就自己实现了一个http服务器,主要功能是将http请求封装httpRequest,通过解析 ...

  3. 5、jvm内存回收——算法

    判定垃圾方法: 1.引用计数法:相互循环应用解决不了 2.根搜索算法: 垃圾搜集算法 1.标记--清除算法 2.复制算法 3.标记--整理算法 4.分代算法

  4. RBAC类的方法

    rbac类的 方法 authenticate($map,$model='')方法 传入查询用户的条件和用户表的MODEL 返回数组包含用户的信息 saveAccessList($authId=null ...

  5. iOS 判断View 是否是第一次显示

    在实现某些需求的时候会有这样的情况,页面第一次加载显示的时候需要某些操作,而以后就不需要重复执行了, 一般这种处理都放在- (void)viewDidLoad或- (id)init因为一般这两个函数除 ...

  6. centos7安装nginx

    一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩. 一:安装 pcre 1.下载地址:百度云盘 http://pan.baidu.com/s/1dFusO3v ...

  7. Python开发入门与实战18-Windows Azure 虚拟机部署

    18. 微软云虚拟机部署 上一章节我们介绍了如何在新浪云部署我们的在python django应用,本章我们来介绍如何Windows Azure上部署我们的应用. 18.1. 注册Windows Az ...

  8. IIS7+windows 64位配置注意事项

    问题和解决办法 1  如果网站为Asp:再asp中注意启用父路径 2  操作必须使用一个可更新的查询:给用户iis_iusrs 一个完全控制的权限 3  Windows(64位IIS)未在本地计算机上 ...

  9. UGUI与DOtween的坑

    在使用ugui和dotween做动画时,如使用transform.DoMoveX,.DoLocalMoveX,.DoMove,.DoLocalMove等方法时,动画效果有可能是错误的,什么时候错误呢? ...

  10. 数据结构《21》----2014 WAP 初试题----Immutable queue

    2014 WAP初试题----实现一个不可变的队列: 看似很简单..实则,不同的版本效率的差距可能是巨大的..甚至难以想象.. 之前用STL库的queue进行了对比,差别非常大.. 用上一篇文章的im ...