代码改变世界

Sql Server数据汇总 – with rollup, with cube, grouping

2010-09-21 15:58  Jeff Chow  阅读(533)  评论(0编辑  收藏  举报
Technorati Tags: with rollup,with cube,grouping

没心情详细说,简单地做个笔记。

 

当需要对数据库数据进行分类统计的时候,往往会用上group by进行分组。而在group by后面还可以加入with rollup和with cube等关键字对数据进行汇总。

假设学生表(Student),有班级(Clazz)、性别(Sex)、年龄(Age)字段。

如:

select Sex, Clazz, Sum(Age)
from Student
group by Sex, Clazz with rollup

又如:

select Sex, Clazz, Sum(Age)
from Student
group by Sex, Clazz with cube

 

至于这两个查询出来的结果就不贴图片/表格了。

上面的查询会出线两种与汇总有关的记录,一种是对Sex的汇总,另一种则是对所有记录的汇总。

而下面的查询则会多出几条,除了对Sex汇总和对所有记录的汇总,还有对Clazz的汇总。

with rollup和with cube的区别在于:

with rollup生成的汇总数据集显示了所选列中值的某一层次结构的聚合

with cube生成的汇总数据集显示了所选列中值的所有组合的聚合

 

自动生成的汇总数据集中会有很多的NULL,通过grouping()函数可以处理这些NULL。

grouping(<字段名>)只会返回两个值,0或者1。如果单元格中的内容是由汇总生成的NULL,grouping()函数返回1,否则返回0。值得注意的是,并不是单元格中的值为NULL就返回1,就算单元格里边通过查询出来的的值是NULL,但它不是由grouping()函数生成的NULL,grouping()函数仍是返回0

那么,通过grouping()函数,就可以使用诸如以下的查询语句来设置这些NULL的显示值。下面例子将性别汇总生成的NULL显示为性别汇总。

select case when grouping(Sex) = 1 then '性别汇总' else Sex as '性别'
from Student
group by Sex, Clszz with rollup

还可以通过where字句来过滤生成的汇总数据集。下面例子把全部的汇总给过滤掉了,只显示对性别的汇总。

select case when grouping(Sex) = 1 then '性别汇总' else Sex as '性别'
from Student
group by Sex, Clazz with rollup
having grouping(Sex) = 0