摘自 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. sublime_markdown

    sublime text 下实现markdown实时预览 这个文档是网上比较流行的教程,你可以按照这个教程来,如果你幸运的话,也许一次性成功.那就到此为止,可以不用看了-- ---------–华丽的 ...

  2. C++小项目:directx11图形程序(二):systemclass

    先上代码: systemclass.h #pragma once #include"graphicsclass.h" const bool FULLSCREEN = true; c ...

  3. linux内核学习之六 进程创建过程学习

    一 关于linux进程概念的补充 关于进程的基本概念这里不多说,把自己的学习所得作一些补充: 1. 在linux内核中,系统最多可以有64个进程同时存在. 2.linux进程包含的关键要素:一段可执行 ...

  4. C++重载流运算符,将存储结构体的vector直接写入文件

    我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢? 采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次 ...

  5. Win7下Hyenae的安装

    (1)下载 链接:http://sourceforge.net/projects/hyenae/   资源:hyenae-0.36-1_fe_0.1-1-win32.exe (2)README --- ...

  6. MYSQL单双向同步

    Master:192.168.1.101 Slave  :192.168.1.102 单向同步(一) 进入Master启动MYSQL [root@localhost ~]# service mysql ...

  7. SQL获取汉字首字母

    )) ) as begin ) ) collate Chinese_PRC_CI_AS,letter )) insert into @t(chr,letter) select '吖','A' unio ...

  8. Android AsyncTask异步任务(二)

    之前我们讲过了AsyncTask 的生命周期(onPreExecute-->doInBackground-->onProgressUpdate-->onPostExecute),今天 ...

  9. RequireJS和seaJS的区别与联系

    RequireJS和seaJS的区别与联系联系:都是模块加载器,倡导模块化开发理念,核心价值是让 JavaScript 的模块化开发变得简单自然.              RequireJS(除了是 ...

  10. 推荐一个Android Studio很实用的插件android-butterknife-zelezny

    当你按钮很多,你又懒得写代码,虽然通过重写onClick比较方便,那么我们能不能连这个switch都省略掉呢? 答案是肯定的,下面这个插件就帮我们解决了这个问题! Android-butterknif ...