group by with cube

sqlserver group by with cube

CUBE运算符生成的结果集是多维数据集,多维数据集是事实数据的扩展,事实数据即记录个别时间的数据,扩展建立在用户准备分析的列上,这些列被称为维,多维数据集是一个结果集,其中包含各纬度所有可能的交叉表格.

CUBE运算符是在Select语句的group by子句中指定的,group by应指定维度列和关键字with cube,结果集将包括维度列中各值的所有可能组合.

示例1.

Sql语句如下:

select * from student

group by with cube

select sex,sclass,sum(score) as 合计

from student

group by sex,sclass with cube

group by with cube

select sex,sclass,sum(score) as 合计

from student

group by sclass,sex with cube

group by with cube

Sql查询时这样运行:

  1. 查询到性别的第一个性别为男,则先查询男生,然后分班级

  2. 查询完成之后,对性别为Sex为男的数据进行合计

  3. 查询性别为女的数据,查询完成之后同样也进行合计

  4. 不分性别、班级进行合计汇总

  5. 以上均是以性别为组来分类,因为至此时关于性别的所有汇总都已经完成

  6. 按照sclass进行分组汇总.

注意:

  1. 分类依据并不是根据select 中的顺序,而是根据group by中的顺序.

  2. 尽量按照使select和group by中的字段顺序一致,这样在显示起来看着更舒服,具体情况具体分析.

对于上述查询的结果,我们可以看出,数据中存在空置问题,绑定到GridView后显示如下:

group by with cube

此中效果并没有达到能够满足实际项目中的需要,所以,我们对Sql语句应进行改进.

使用Grouping区分空值.

如何区分使用CUBE之后产生的空值和实际查询中得到的空值.这个问题可以用grouping函数来解决.如果列中的值来来自查询数据,则grouping返回0,如果列中的值是cube产生的空值,则返回1

示例2.

Sql如下:

select case when(grouping(sex)=1) then '小记' else sex

end as 性别,

case when(grouping(sclass)=1) then '小记' else sclass

end as 班级,

sum(score)

from student

group by sex,sclass with cube

group by with cube

group by with cube

CUBE可以生成n维的多维数据集,即具有任意维目的多维数据集,只有一个维度的多维数据集可用于生成合计.

示例3:

SQL:

select case when(grouping(sex)=1) then '合计' else sex end as 性别,

sum(score) as 合计

from student

group by sex with cube

group by with cube

group by with cubegroup by with cube qq_43688472 发布了198 篇原创文章 · 获赞 79 · 访问量 6万+ 私信 关注
上一篇:(枚举)完美立方


下一篇:【入门】Kylin 基本原理及概念