`
zzc1684
  • 浏览: 1224395 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Sql学习第四天——SQL关于with cube,with rollup和grouping

 
阅读更多
Sql学习第四天——SQL关于with cube,with rollup和grouping

Sql学习第三天——SQL关于使用CTE(公用表表达式)的递归查询
http://www.2cto.com/database/201303/197662.html

关于with cube ,with rollup 和 grouping
通过查看sql 2005的帮助文档找到了CUBE 和 ROLLUP 之间的具体区别:
CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
再看看对grouping的解释:
  当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。
仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相关联的选择列表中才允许分组。
当看到以上的解释肯定非常的模糊,不知所云和不知道该怎样用,下面通过实例操作来体验一下:
先建表(dbo.PeopleInfo):
CREATE TABLE [dbo].[PeopleInfo](
  [id] [int] IDENTITY(1,1) NOT NULL,
  [name] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
  [numb] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
  [phone] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
  [FenShu] [int] NULL
) ON [PRIMARY]
向表插入数据:
insert into peopleinfo([name],numb,phone,fenshu) values ('李欢','3223','1365255',80)
insert into peopleinfo([name],numb,phone,fenshu) values ('李欢','322123','1',90)
insert into peopleinfo([name],numb,phone,fenshu) values ('李名','3213112352','13152',56)
insert into peopleinfo([name],numb,phone,fenshu) values ('李名','32132312','13342563',60)
insert into peopleinfo([name],numb,phone,fenshu) values ('王华','3223','1365255',80)
查询出插入的全部数据:
select * from dbo.PeopleInfo
结果如图:

操作一:先试试:1, 查询所有数据;2,用group by 查询所有数据;3,用with cube。这三种情况的比较
SQL语句如下:
select * from dbo.PeopleInfo  --1, 查询所有数据;
select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb  --2,用group by 查询所有数据;
select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with cube  --3,用with cube。这三种情况的比较
结果如图:

结果分析:
  用第三种(用with cube)为什么会多出来有null的字段值呢?通过分析图上的值得组合会发现是怎么回事儿了,以第三条数据(李欢,null,170)为例:它只是把姓 名是【李欢】的分为了一组,而没有考虑【numb】,所以有多出来了第三条数据,也说明了170是怎么来的。其他的也是这样。再回顾一下帮助文档的解 释:CUBE 生成的结果集显示了所选列中值的所有组合的聚合, 发现明了了许多。
操作二:1,用with cube;2,用with rollup 这两种情况的比较
SQL语句如下:
select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with cube  --用with cube。
select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with rollup  --用with rollup。
结果如图:

结果分析:
  为什么with cube 比 with rollup多出来一部分呢?原来它没有显示,以【numb】分组而不考虑【name】的数据情况。再回顾一下帮助文档的解释:ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合,那这个【某一层次】又是以什么为标准的呢?我的猜想是:距离group up最近的字段必须考虑在分组内。
证明猜想实例:
操作:用两个group up 交换字段位置的sql语句和一个在group up 后面增加一个字段的sql语句进行比较:
SQL语句如下:
select [name],numb from dbo.PeopleInfo group by [name],numb with rollup
select [name],numb from dbo.PeopleInfo group by numb,[name] with rollup
select [name],numb,phone from dbo.PeopleInfo group by [name],numb,phone with rollup

结果如图:

通过结果图的比较发现猜想是正确的。
---------------------------------------------------grouping-------------------------------------------------
现在来看看grouping的实例:
SQL语句看看与with rollup的结合(与with cube的结合是一样的):

select [name],numb,grouping(numb) from dbo.PeopleInfo group by [name],numb with rollup
结果如图:

结果分析:
  结合帮助文档的解释:当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。  很容易理解再此就不多解释了。
分享到:
评论

相关推荐

    Sql学习第四天——SQL 关于with cube,with rollup和grouping解释及演示

    `CUBE`和`ROLLUP`是`WITH`子句中的两个特殊运算符,它们主要用于多维度数据分析和聚合操作,通常在`GROUP BY`语句中配合使用。 1. **CUBE运算符**: `CUBE`生成的结果集包含了所有可能的子集,即所选列中值的所有...

    cube与rollup学习总结

    ### cube与rollup学习总结 在数据库查询语言SQL中,`GROUP BY`子句用于将数据按照一个或...通过本文的学习,相信您已经对`CUBE`、`ROLLUP`和`GROUPING`有了较为全面的了解,希望这些知识点能对您的实际工作有所帮助。

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

    GROUP BY 子句(rollup, cube, grouping sets)实例说明 GROUP BY 子句是 SQL 语言中用于分组数据的关键字,它可以根据一个或多个列对数据进行分组,并对每个分组应用聚合函数,以便计算和输出所需的结果。GROUP BY...

    Oracle ROLLUP和CUBE 用法

    Oracle数据库中的ROLLUP和CUBE是两种用于生成数据汇总的SQL操作,它们在数据分析和报告制作中非常有用。本文将详细介绍这两个概念以及如何在实际应用中使用它们。 首先,我们来理解`ROLLUP`。ROLLUP操作是GROUP BY...

    rollup cube grouping sets的用法

    在数据库查询语言 SQL 中,`ROLLUP`, `CUBE`, 和 `GROUPING SETS` 是三个重要的概念,它们主要用于处理多维度数据的汇总和分组问题,使得数据分析更加灵活高效。接下来,我们将详细介绍这三个概念的原理、语法以及...

    SQLServer中汇总功能的使用GROUPING,ROLLUP和CUBE

    总的来说,GROUPING、ROLLUP和CUBE是SQL Server中增强数据分析能力的重要工具,它们能够帮助用户更有效地探索和理解数据,生成多层次、多角度的汇总报告。通过熟练掌握这些技术,数据库管理员和数据分析师可以更好地...

    oracle中聚合函数的扩展使用(ROLLUP CUBE、GROUPING()函数与ROLLUP、CUBE的结合使用等)

    当我们需要更复杂的分组和汇总信息时,可以使用扩展的聚合功能,如ROLLUP、CUBE以及GROUPING()和GROUPING_ID()函数。这些功能允许我们生成多层次的总计和小计,为数据分析提供了极大的灵活性。 1. ROLLUP子句: ...

    SQLSERVER中union,cube,rollup,cumpute运算符使用说明

    在SQLSERVER中,有四种特殊的运算符用于处理和汇总数据:UNION、CUBE、ROLLUP和COMPUTE。这些运算符在数据查询和分析时非常有用,尤其在处理多个数据源合并、多维数据分析和自定义汇总计算时。 首先,我们来详细...

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

    而在更复杂的场景下,为了方便地处理多级别的汇总数据,SQL提供了三种额外的语法:`ROLLUP`、`CUBE`以及`GROUPING SETS()`。这些语法可以帮助我们更加灵活地处理分组结果,并且可以有效地减少查询次数,提高效率。 ...

    grouping 解释及演示.rar

    总结起来,`GROUP BY`、`WITH CUBE`、`WITH ROLLUP`和`GROUPING`是SQL中的高级聚合技术,它们允许我们在数据探索和分析中进行复杂的汇总操作。理解并熟练运用这些概念,可以帮助我们更好地理解数据,从而做出更明智...

    《Pro Oracle SQL》Chapter7 --7.6Eliminate NULLs with the GROUPING() Function

    这个函数通常与GROUPING SETS、CUBE或ROLLUP等高级分组技术结合使用,帮助用户更灵活地处理NULL值和其他分组情况。 例如,如果我们有一个包含产品信息的数据表,其中有些产品的供应商信息可能是NULL,我们可能想要...

    《Pro Oracle SQL》Chapter7 Advanced Grouping -- 7.5Putting CUBE To Work

    《Pro Oracle SQL》Chapter 7 Advanced Grouping 是一本关于Oracle SQL高级分组技术的专业书籍,其中7.5小节着重讲解了CUBE操作在实际工作中的应用。CUBE是SQL中的一种多维度分析工具,它允许我们在数据分组时生成...

    rollup及cube的使用

    ### Oracle中的ROLLUP与CUBE使用详解 在Oracle数据库中,`ROLLUP`与`CUBE`是非常重要的分组函数,被广泛应用于数据汇总、数据分析等场景中。这两个功能可以帮助开发人员快速地对数据进行多维度分析,是开发人员必备...

    Oracle高级sql学习与练习

    10. 增强GROUP BY功能,使用GROUP BY扩展选项,如GROUPING SETS、CUBE和ROLLUP等,可以实现更复杂的聚合计算。 11. 分析函数(ANALYTICAL FUNCTIONS)是Oracle SQL的高级特性之一,允许在数据集上进行窗口计算,...

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

    在某些情况下,你可能需要同时使用WITH CUBE和WITH ROLLUP,这可以通过GROUPING SETS实现。你可以创建一个包含所有所需分组的集合,包括CUBE和ROLLUP的所有组合。 4. **GROUP_ID 函数**: Oracle特有的GROUP_ID...

    grouping or grouping_id in ORACLE

    在Oracle数据库中,`GROUPING` 和 `GROUPING_ID` 是两种非常有用的函数,它们能够帮助用户更好地理解和组织聚合查询的结果。这两种函数主要用于处理复杂的分组情况,尤其是在使用`ROLLUP` 或 `CUBE` 时更为显著。...

Global site tag (gtag.js) - Google Analytics