Sql Server数据汇总 – with rollup, with cube, grouping
2010-09-21 15:58 Jeff Chow 阅读(533) 评论(0) 编辑 收藏 举报没心情详细说,简单地做个笔记。
当需要对数据库数据进行分类统计的时候,往往会用上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