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

    sfliter源码在vs08中编译 出现 错误error LNK2019: unresolved external symbol __except_handler4 referenced in fun ...

  2. sql 2008 修改链接服务器 Rpc &Rpc Out

    From: http://blog.csdn.net/gnolhh168/article/details/41725873 USE [master] GO EXEC master.dbo.sp_ser ...

  3. Linux 动态链接库

    如何使用动态链接库 Linux下打开使用动态链接库需要三步(实际上和windows下基本一样):1.加载动态链接库,通过调用库函数dlopen()获得链接库的句柄,对应于windows下的 AfxLo ...

  4. Redis概述

    1.       Redis是使用内存存储(in-momory)的非关系型数据. 2.       Redis的数据存储选项共有5种:字符串.列表.集合.散列表.有序集合. 3.       Redi ...

  5. Result Maps collection does not contain value for java.lang.Integer异常处理

    使用Mybatis的时候出现这个问题是因为配置文件的问题造成的,mybatis需要写大量的配置文件, 尽管有mybatis-generator,但是里面的内容有很多还是要自己去写的,在这过程中难免会出 ...

  6. as3 代码加解密

    private var loader:URLLoader; ... private function init():void { loader = new URLLoader; req=URLRequ ...

  7. java实现服务端守护进程来监听客户端通过上传json文件写数据到hbase中

    1.项目介绍: 由于大数据部门涉及到其他部门将数据传到数据中心,大部分公司采用的方式是用json文件的方式传输,因此就需要编写服务端和客户端的小程序了.而我主要实现服务端的代码,也有相应的客户端的测试 ...

  8. mysql 分组查询问题 group_concat

    这几天在做购物车的时候.购物车内的商品为一个商品占一行,结果再从数据库读出的时候,没有分组,而是循环所有的内容出来,然后进行判断.如果一样的话就把他保存到一个变量中.但是自己逻辑没搞清楚.一直出bug ...

  9. android activity改变另一个activity ui

    android开发之在activity中控制另一个activity的UI更新   转自:http://www.cnblogs.com/ycxyyzw/p/3875544.html 第一种方法: 遇到一 ...

  10. 使用phantomjs实现highcharts等报表通过邮件发送(本文仅提供完整解决方案和实现思路,完全照搬不去整理代码无法马上得到效果)

    前不久项目组需要将测试相关的质量数据通过每日自动生成报表展示,并自动通过将报表作为邮件正文内容知会到干系人邮箱.那么问题来了,报表生成了,但是邮件怎么发送,因为highcharts等报表都是通过JS和 ...