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

关于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。  很容易理解再此就不多解释了。

时间: 2024-11-03 14:18:45

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

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

关于with cube ,with rollup 和 grouping 通过查看sql 2005的帮助文档找到了CUBE 和 ROLLUP 之间的具体区别: CUBE 生成的结果集显示了所选列中值的所有组合的聚合.ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合. 再看看对grouping的解释: 当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1:当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0. 仅在与包含 C

PL/SQL学习笔记(四)

这部分主要讲述在PL/SQL中如何访问oracle (一)检索单行数据 在PL/SQL嵌入select语句,使用方法: SELECT select_list INTO variable_name1,variable_name2,variable_name3... FROM TABLE WHRE condition 例:   DECLARE   v_sal  NUMBER ( 6 , 2 );  v_id  NUMBER ; BEGIN   v_id: = ' &id ' ;   SELECT  

SQL学习笔记四 聚合函数、排序方法_MsSql

聚合函数 count,max,min,avg,sum... select count (*) from T_Employee select Max(FSalary) from T_Employee 排序 ASC升序 DESC降序 select * from T_Employee order by Fage 先按年龄降序排列.如果年龄相同,则按薪水升序排列 select * from T_Employee order by FAge DESC,FSalary ASC order by 要放在 wh

SQL学习笔记四 聚合函数、排序方法

聚合函数 count,max,min,avg,sum... select count (*) from T_Employee select Max(FSalary) from T_Employee 排序 ASC升序 DESC降序 select * from T_Employee order by Fage 先按年龄降序排列.如果年龄相同,则按薪水升序排列 select * from T_Employee order by FAge DESC,FSalary ASC order by 要放在 wh

Sql学习第三天——SQL 关于CTE(公用表达式)的递归查询使用_MsSql

关于使用CTE(公用表表达式)的递归查询----SQL Server 2005及以上版本 公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE.递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式. 当某个查询引用递归 CTE 时,它即被称为递归查询.递归查询通常用于返回分层数据,例如:显示某个组织图中的雇员或物料清单方案(其中父级产品有一个或多个组件,而那些组件可能还有子组件,或者是其他父级产品的组件)中的数据. 递归 C

PL/SQL学习笔记(三) ——PL/SQL代码编写规则

养成良好的代码编写习惯,PL/SQL代码编写规则: 1.标识符命名规则 1)定义变量时以v_作为前缀,如v_sal 2)定义常量时以c_作为前缀,如c_rate 3)定义游标时,建议使用_cursor作为后缀,如emp_cursor 4)定义异常时,以e_作为前缀,如e_integrity_error 5)定义PL/SQL表类型时,使用_table_type作为后缀,如sal_table_type. 6)定义表变量时,以_table作为后缀,如sal_table 7)同样,定义PL/SQL记录型

Sql学习第三天——SQL 关于with ties介绍_MsSql

关于with ties 对于with ties一般是和Top , order by相结合使用的,会查询出最后一条数据额外的返回值(解释:如果按照order by 参数排序TOP n(PERCENT)返回了前面n(pencent)个记录,但是n+1-n+k条记录和排序后的第n条记录的参数值(order by 后面的参数)相同,则n+1.-.n+k也返回.n+1.-.n+k就是额外的返回值). 实验: 实验用表(PeopleInfo): 复制代码 代码如下: CREATE TABLE [dbo].[

Sql学习第三天——SQL 关于with ties介绍

关于with ties 对于with ties一般是和Top , order by相结合使用的,会查询出最后一条数据额外的返回值(解释:如果按照order by 参数排序TOP n(PERCENT)返回了前面n(pencent)个记录,但是n+1-n+k条记录和排序后的第n条记录的参数值(order by 后面的参数)相同,则n+1.-.n+k也返回.n+1.-.n+k就是额外的返回值). 实验: 实验用表(PeopleInfo):复制代码 代码如下:CREATE TABLE [dbo].[Pe

sql语句实现四种九九乘法表_MsSql

下面用while 和 if 条件写的SQL语句的四种九九乘法表  sql语句实现--x 左下角九九乘法表 DECLARE @I INT ,@J INT,@S VARCHAR() SET @I= WHILE @I< BEGIN SET @J= SET @S='' WHILE @J<=@I BEGIN SET @S=@S+CAST(@J AS CHAR())+'*'+CAST(@I AS CHAR())+'='+CAST((@I*@J)AS CHAR()) SET @J=@J+ END PRINT