现在的位置: 首页 > 综合 > 正文

SqlServer-ROLLUP

2012年04月14日 ⁄ 综合 ⁄ 共 1176字 ⁄ 字号 评论关闭

在生成包含小记和合计的报表时,ROLLUP运算符很有用,ROLLUP运算符生成的结果集类似于CUBE运算符所生成的结果集.

ROLLUP和CUBE的区别在于:

1. cube生成的结果集显示了所选列的所有组合的聚合

2. rollup生成的结果集显示了所选列中值的某一个层次结构的聚合

示例:

Sql:

With rollup:

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

case when(grouping(sclass)=1) then '合计' else sclass end,

sum(score) '合计'

from student

group by sex,sclass with rollup

With cube

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

区别解释:

1. cube操作为所选的列的所有组合做了汇总, 男/2,男/3,男/小记,女/2,女/3,女/小记,小记/小记,小记/2,小记/3

2. rollup操作并不针对多列中的所有可能进行汇总,而是以左边的列为主,列出右边的所有可能,然后汇总,不会针对右边的列,将左边列的所有汇总可能计算出来.

优点:

1. rollup返回单个结果集,而compute by返回多个结果集,多个结果集会增加代码的复杂性

2. rollup可以在服务器游标中使用,compute by不可以

3. rollup比compute by 执行起来更加高效

通过排序,可以实现系统想要的效果,

可以将小记汇总放在最上面,也可以将小记汇总放在各个分组之上.

例如:

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

case when(grouping(sclass)=1) then '合计' else sclass end,

sum(score) '合计'

from student

group by sex,sclass with rollup

order by grouping(sex) desc,grouping(sclass) desc,sex

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

case when(grouping(sclass)=1) then '合计' else sclass end,

sum(score) '合计'

from student

group by sex,sclass with rollup

order by grouping(sex) desc,sex,grouping(sclass) desc

抱歉!评论已关闭.