数据库——cube和rollup的使用与区别<使用rollup或cube通过交叉列可产生高级汇总结果集>
2017-09-21 15:26
351 查看
要使用CUBE,首先要了解GROUP BY。 其实CUBE和ROLLUP区别不太大,只是在基于GROUP BY 子句创建和汇总分组的可能的组合上有一定差别,CUBE将返回的更多的可能组合。如果在GROUP BY子句中有N个列或者是有N个表达式的话,SQLSERVER在结果集上会返回2的N-1次幂个可能组合。 CUBE和ROLLUP之间的区别在于: CUBE 生成的结果集显示了所选列中值的所有组合的聚合。 ROLLUP生成的结果集显示了所选列中值的某一层次结构的聚合 ROLLUP就是将GROUP BY后面的第一列名称求总和,而其他列并不要求 而CUBE则会将每一个列名称都求总和
COPY了一个例子,首先用ROLLUP
查询语句: Select cust_id,prod 4000 uct_code,sum(qty) as quantity From invoices Where cust_id IN (4,5) Group By cust_id, product_code WITH Rollup Order By cust_id 查询结果: cust_id product_code quantity ------- -------------- ------- NULL NULL 10 4 5 3 4 6 3 4 NULL 6 5 5 4 5 NULL 4 第一行是4,5买的所有产品的数量( 第二行是4买5产品的数量 第三行是4买6产品的数量 第四行是4买所有产品的数量(按照cust_id=4总汇) 第五行是5买5产品的数量 第六行是5买所有产品的数量(按照cust_id=5总汇) 如果查询语句中的ROLLUP关键字更改为CUBE,就会多出有关产品的信息 查询结果: cust_id product_code quantity ------- -------------- ------- NULL NULL 10 NULL 5 7 NULL 6 3 4 5 3 4 6 3 4 NULL 6 5 5 4 5 NULL 4 第2行是所有顾客买5产品的数量(product_code=5 总汇) 第3行是所有顾客买6产品的数量(product_code=6 总汇)
附:其他解释
Oracle ROLLUP和CUBE 用法Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。 如果是Group by ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。 如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 grouping_id()可以美化效果。除了使用GROUPING函数,还可以使用GROUPING_ID来标识GROUP BY的结果。 也可以 Group by Rollup(A,(B,C)) ,Group by A Rollup(B,C),…… 这样任意按自己想要的形式结合统计数据,非常方便。
3、使用grouping美化结果
在我们使用了cube和rollup的的group by语句的结果中可以看到有些列是null,这些是小结生成了,我们可以使用grouping函数把这这些替换成有意义的文字,比如小计、合计。grouping函数官方是这样说明的:GROUPING:是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。 仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择列表中才允许分组。语法:GROUPING ( column_name )参数:column_name是 GROUP BY 子句中用于检查 CUBE 或 ROLLUP 空值的列。返回类型:int好了,有了上面的知识我们把这前写的第一个sql语句改下:SELECT case when grouping(p.age)=1 THEN '总计' ELSE cast(p.age as varchar(50)) END age,COUNT(1) AS Cnt
FROM Person p
GROUP BY p.age with ROLLUP
执行结果:
两个多个字段的group by 稍微复杂一些。SELECT case when grouping(p.address)=1 THEN '总计' ELSE p.[address] END address
,case when grouping(p.age)=1 AND grouping(p.[ad
9f50
dress])<>1 THEN '小计' ELSE cast(p.age as varchar(50)) END age
,COUNT(1) AS Cnt
FROM Person p
GROUP BY p.address,p.age with ROLLUP
ORDER BY GROUPING(p.[address]),GROUPING(p.age)
执行结果:
上面加了一个排序:ORDER BY GROUPING(p.[address]),GROUPING(p.age)这样汇总小计行都在最后了,显得更加直观了。注:grouping用法的原博文地址:点击打开链接
相关文章推荐
- [SQL]详解CUBE和ROLLUP区别<使用rollup或cube通过交叉列可产生高级汇总结果集>
- 使用lucene.net2.0 搜索数据库的例子<转自csdn>
- SQL Server中汇总功能的使用GROUPING,ROLLUP和CUBE
- 使用CUBE和ROLLUP对数据进行汇总
- 使用CUBE和ROLLUP对数据进行汇总
- SQL Server中汇总功能的使用GROUPING,ROLLUP和CUBE
- 使用CUBE和ROLLUP对数据进行汇总
- C语言中两种方式使用#include命令,#include <>与#include ””的区别是什么?
- spring3 jsp页面使用<form:form modelAttribute="xxxx" action="xxxx">报错,附连接数据库的spring MVC annotation 案例
- SQLServer中汇总功能的使用GROUPING,ROLLUP和CUBE
- VC 使用ADO连接数据库的问题!error C2059: 语法错误 : “<L_TYPE_raw>” .
- Spring配置文件中使用ref local与ref bean的区别. 在ApplicationResources.properties文件中,使用<ref bean>与<ref local>方法如下
- ASP.NET MVC2 使用绑定时 等号和冒号的差别 <%=%>和<%:%>的区别
- .NET GridView使用滚动条(通过<div>)
- SQL Server中汇总功能的使用GROUPING,ROLLUP和CUBE
- 如何使用C#来控制<高级安全Windows防火墙>(Windows Vista/2008 R2/7-x86x64)
- SQLServer中汇总功能的使用GROUPING,ROLLUP和CUBE
- 使用CUBE和ROLLUP对数据进行汇总
- ThreadStaticAttribute和ThreadLocal<T>使用区别总结
- 使用CUBE和ROLLUP对数据进行汇总(转载)