`
T240178168
  • 浏览: 367953 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

group by后加rollup子句的用法

阅读更多
group by后带rollup子句的用法(真是丑死人了,接触ORACLE一两年了今天才知道还有这样一个用法),group by后带rollup子句这个子句所产生的功能实在是太高级了,见了就高兴。但学习完后感觉也没什么的,很简单的。

下面按我的理解简单总结一下:

一、如何理解group by后带rollup子句所产生的效果

group by后带rollup子句的功能可以理解为:先按一定的规则产生多种分组,然后按各种分组统计数据(至于统计出的数据是求和还是最大值还是平均值等这就取决于SELECT后的聚合函数)。  www.2cto.com  因此要搞懂group by后带rollup子句的用法主要是搞懂它是如何按一定的规则产生多种分组的。另group by后带rollup子句所返回的结果集,可以理解为各个分组所产生的结果集的并集且没有去掉重复数据。下面举例说明:

1、对比没有带rollup的goup by

例:Group by A ,B

产生的分组种数:1种;

即group by A,B

返回结果集:也就是这一种分组的结果集。

2、带rollup但group by与rollup之间没有任何内容

例1:Group by rollup(A ,B)

产生的分组种数:3种;

第一种:group by A,B

第二种:group by A
  www.2cto.com 
第三种:group by NULL

(说明:本没有group by NULL 的写法,在这里指是为了方便说明,而采用之。含义是:没有分组,也就是所有数据做一个统计。例如聚合函数是SUM的话,那就是对所有满足条件的数据进行求和。此写法的含义下同)

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

例2:Group by rollup(A ,B,C)

产生的分组种数:4种;

第一种:group by A,B,C

第二种:group by A,B

第三种:group by A

第四种:group by NULL

返回结果集:为以上四种分组统计结果集的并集且未去掉重复数据。

3、带rollup但group by与rollup之间还包含有列信息

例1:Group by A , rollup(A ,B)

产生的分组种数:3种;

第一种:group by A,A,B    等价于group by A,B

第二种:group by A,A      等价于group by A

第三种:group by A,NULL  等价于group by A

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

例2:Group by C , rollup(A ,B)

产生的分组种数:3种;

第一种:group by C,A,B   
  www.2cto.com 
第二种:group by C,A     

第三种:group by C,NULL  等价于group by C

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

4、带rollup且rollup子句括号内又使用括号对列进行组合

例1:Group by rollup((A ,B))

产生的分组种数:2种;

第一种:group by A,B

第二种:group by NULL

返回结果集:为以上两种分组统计结果集的并集且未去掉重复数据。

例2:Group by rollup(A ,(B,C))

产生的分组种数:3种;

第一种:group by A,B,C

第二种:group by A
  www.2cto.com 
第三种:group by NULL

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

  注:对这种情况,可以理解为几个列被括号括在一起时,就只能被看成一个整体,分组时不需要再细化。因此也可推断rollup括号内也顶多加到一重括号,加多重了应该没有任何意义(这个推断我没有做验证的哦)。

二、与rollup组合使用的其它几个辅助函数

1、grouping()函数

  必须接受一列且只能接受一列做为其参数。参数列值为空返回1,参数列值非空返回0。

2、grouping_id()函数

  必须接受一列或多列做为其参数。

返回值为按参数排列顺序,依次对各个参数使用grouping()函数,并将结果值依次串成一串二进制数然后再转化为十进制所得到的值。

例如:grouping(A) = 0 ; grouping(B) = 1;

     则:grouping_id(A,B) = (01)2 = 1;

                    grouping_id(B,A) = (10)2 =2;

3、group_id()函数
  www.2cto.com 
  调用时不需要且不能传入任何参数。

返回值为某个特定的分组出现的重复次数(第一大点中的第3种情况中往往会产生重复的分组)。重复次数从0开始,例如某个分组第一次出现则返回值为0,第二次出现时返回值为1,……,第n次出现返回值为n-1。

       注:使用以上三个函数往往是为了过滤掉一部分统计数据,而达到美化统计结果的作用。

三、group by后带rollup子句与group by后带cube子句区别

group by后带rollup子句与group by后带cube子句的唯一区别就是:

带cube子句的group by会产生更多的分组统计数据。cube后的列有多少种组合(注意组合是与顺序无关的)就会有多少种分组。

例:Group by cube(A ,B,C)

产生的分组种数:8种;

第一种:group by A,B,C

第二种:group by A,B

第三种:group by A,C

第四种:group by B,C

第五种:group by C

第六种:group by B

第七种:group by A
  www.2cto.com 
第八种:group by NULL

返回结果集:为以上八种分组统计结果集的并集且未去掉重复数据。

四、group by后带grouping sets子句

   group by后带grouping sets子句效果就是只返回小记记录,即只返回按单个列分组后的统计数据,不返回多个列组合分组的统计数据。

例1:Group by grouping sets(A )

产生的分组种数:1种;

第一种:group by A

返回结果集:即为以上一种分组的统计结果集。

例2:Group by grouping sets(A ,B)

产生的分组种数:2种;

第一种:group by A

第二种:group by B

返回结果集:为以上两种分组统计结果集的并集且未去掉重复数据。

例3:Group by grouping sets (A ,B,C)

产生的分组种数:3种;

第一种:group by A
  www.2cto.com 
第二种:group by B

第三种:group by C

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

select t.city_name,
       decode(t.directline_type,
              null,
              '总数',
              directline_type,
              directline_type),
       sum(t.amount)
from tmp_dl_info t
group by rollup(t.city_name, t.directline_type)
分享到:
评论

相关推荐

    GROUP BY子句(rollup,cube,grouping sets)实例说明

    GROUP BY 子句有多种形式,本文将通过实例来说明 GROUP BY 子句的三种样式:GROUP BY、GROUP BY ROLLUP、GROUP BY CUBE、GROUP BY GROUPING SETS。 1. GROUP BY 语句 GROUP BY 语句是最基本的分组语句,它可以根据...

    SQL语句中Group BY 和Rollup以及cube用法

    ### SQL语句中Group BY 和Rollup以及Cube用法 #### Group BY 子句 `GROUP BY`子句是SQL查询中的一个非常重要的部分,它用于将数据表中的行按照一个或多个列进行分组,使得可以对每个分组执行聚合函数(如SUM、...

    Oracle的Rollup用法

    在 Oracle 中,ROLLUP 子句可以与 GROUP BY 子句配合使用,以便对数据进行分组和聚合。ROLLUP 子句可以指定一个或多个字段,用于对数据进行分组和聚合。 例如,以下是对 grade 字段进行 rollup 的示例: SQL> ...

    order by 、group by 、having的用法

    - 当使用 `GROUP BY` 时,`SELECT` 语句中未包含在聚合函数内的列必须出现在 `GROUP BY` 子句中。例如,`SELECT department, COUNT(employee) FROM employees GROUP BY department` 会返回每个部门的员工数量。 - ...

    使用ROLLUP函数生成报表的小计、合计

    `ROLLUP`是一个用于GROUP BY子句的扩展选项,它能够帮助我们生成包含不同层级汇总信息的结果集。通过使用`ROLLUP`,可以在结果集中自动生成各种级别上的汇总数据,而无需额外编写复杂的SQL语句。 #### 二、基本用法...

    Sequelize中用group by进行分组聚合查询

    在SQL中,分组查询是通过`GROUP BY`子句来实现的,它可以将数据按照一个或多个列的值进行分组,通常结合聚合函数一起使用,以便对每个分组执行计算。 1. SQL中的分组查询 在SQL中,使用`GROUP BY`语句进行分组操作...

    group by用法.doc

    4. **ROLLUP操作**: 使用`WITH ROLLUP`可以添加汇总行,例如`SELECT CategoryID, SUM(UnitPrice), GROUPING(CategoryID) AS 'Grouping' FROM Products GROUP BY CategoryID WITH ROLLUP`。`GROUPING`函数标识哪一行...

    ORACLE学习笔记系列(15)使用扩展的 GROUP BY 子句

    在"ORACLE学习笔记系列(15)使用扩展的 GROUP BY 子句"这篇博文中,作者深入探讨了GROUP BY子句的高级用法,特别是如何利用扩展功能来处理更复杂的查询需求。 在标准的GROUP BY语句中,我们通常会指定一列或多列,...

    Oracle中分组查询group by用法规则详解

    `HAVING`子句用于在`GROUP BY`后过滤数据,类似于`WHERE`子句,但它作用于分组后的数据,因此可以使用聚合函数。例如,以下查询返回部门总薪水大于8500的部门编号和总薪水: ```sql SELECT deptno, SUM(sal) ...

    order_by_、group_by_、having的用法

    3. `HAVING`:`HAVING`子句用于在`GROUP BY`后对已分组的数据进行过滤,类似于`WHERE`子句,但`WHERE`是在数据分组前过滤,而`HAVING`是在分组后过滤。这意味着`HAVING`可以基于聚合函数的结果设置条件,而`WHERE`则...

    总结下sqlserver group by 的用法

    在SQL Server中,`GROUP BY`语句是一个用于聚合数据的关键子句,它允许我们将数据分组,并对每个组执行聚合函数(如`COUNT`, `SUM`, `AVG`, `MAX`, `MIN`等)。在数据库查询中,当你需要根据某个或多个列的值对数据...

    查询使用Group by子句从多个表中获取数据

    在PostgreSQL中,`GROUP BY`支持更复杂的用法,包括使用`WITH CUBE`、`WITH ROLLUP`和`GROUPING SETS`来创建汇总层次结构。例如,如果我们想查看每个部门以及所有部门的总员工数,可以使用`WITH ROLLUP`: ```sql ...

    sql 分组,统计等常用语句

    `HAVING`子句用于过滤`GROUP BY`后的结果集,其条件通常涉及聚合函数。例如,找出只有一个客户的邮政编码: ```sql SELECT ZIP, COUNT(*) AS NumberOfCustomers FROM Customers GROUP BY ZIP HAVING COUNT(*) = 1; ...

    oracle group by语句实例测试

    - **HAVING子句**:`HAVING`用于在`GROUP BY`后的条件过滤,与`WHERE`不同,`WHERE`是在分组前过滤,而`HAVING`是在分组后过滤。 **优化`GROUP BY`查询:** - **索引**:为`GROUP BY`列创建合适的索引可以显著提升...

    mysqlgroupby用法共2页.pdf.zip

    MySQL中的GROUP BY语句是数据库查询中的一个关键部分,它用于根据一个或多个列...通过组合使用GROUP BY、聚合函数、HAVING、ROLLUP、CUBE和GROUPING SETS,你可以有效地对数据进行汇总、分析和展示,从而支持决策制定。

    rollup,cube,grouping sets()的个人理解

    在SQL查询中,当我们需要对数据进行多维度的分组统计时,经常会用到`GROUP BY`子句来完成这一任务。而在更复杂的场景下,为了方便地处理多级别的汇总数据,SQL提供了三种额外的语法:`ROLLUP`、`CUBE`以及`GROUPING ...

    Sql Server 分组统计并合计总数及WITH ROLLUP应用

    `GROUP BY`语句是实现这一目标的关键,而`WITH ROLLUP`是扩展这个功能的一种方法,特别适用于生成带有层次结构的小计和总计的报表。 `GROUP BY`语句用于将数据行分组成多个组,每个组由共享相同列值的行组成。例如...

    oracle 入门

    - GROUPING只能在GROUP BY子句之后使用。 - 结果集中GROUPING返回1表示聚合,返回0表示非聚合。 **示例**: 假设有一个`tt`表,包含产地、水果和重量三个字段,我们希望计算每个产地的水果重量总和,并在结果中...

Global site tag (gtag.js) - Google Analytics