sql – 何时使用GROUPING SETS,CUBE和ROLLUP

前端之家收集整理的这篇文章主要介绍了sql – 何时使用GROUPING SETS,CUBE和ROLLUP前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近了解到有关GROUPING SETS,CUBE和ROLLUP在sql Server中定义多个分组集.

我在问什么是在什么情况下使用这些功能?使用它们的好处和优点是什么?

SELECT shipperid,YEAR(shippeddate) AS shipyear,COUNT(*) AS numorders
FROM Sales.Orders
GROUP BY GROUPING SETS ( ( shipperid,YEAR(shippeddate) ),( shipperid ),( YEAR(shippeddate) ),( ) );


SELECT shipperid,COUNT(*) AS numorders
FROM Sales.Orders
GROUP BY CUBE( shipperid,YEAR(shippeddate) );


SELECT shipcountry,shipregion,shipcity,COUNT(*) AS numorders
FROM Sales.Orders
GROUP BY ROLLUP( shipcountry,shipcity );

解决方法

首先,对于那些还没有阅读过这个问题的人:

> Using GROUP BY with ROLLUP,CUBE,and GROUPING SETS

话虽如此,不要把这些分组选项作为获取结果集的方式.这些是性能工具.

我们以ROLLUP为例,

我可以使用以下查询获取每个GrpCol值的记录计数.

SELECT   GrpCol,count(*) AS cnt
FROM     dbo.MyTable
GROUP BY GrpCol

我可以使用以下查询来概括地“汇总”所有记录的计数.

SELECT   NULL,count(*) AS cnt
FROM     dbo.MyTable

而且,如果我用ROLLUP子句编写了第一个查询(这就是为什么我把NULL放在那里),我可以将所有上述两个查询的UNION都得到完全相同的结果.

实际上我可以更方便地执行这两个不同的查询,因为我的分组结果与我的总计分开.为什么我想让我的最终的混合权利与其余的结果?答案是,使用ROLLUP子句来组合更有效率. sql Server将使用一个执行计划,一次计算所有聚合.将其与UNION ALL示例进行比较,该示例将提供完全相同的结果,但使用效率较低的执行计划(两个表扫描而不是一个).

想象一下极端的例子,你正在处理一个数据集如此之大,每次扫描数据需要一整个小时.您必须每天提供基本上每个可能的维度(方式来分割)数据的总计.啊哈!我打赌这些分组选项之一就是你所需要的.如果将该扫描的结果保存到特殊的模式布局中,则可以在保存的结果中的其余时间内运行报告.

所以我基本上是说你正在研究一个数据仓库项目.对于我们其他人来说,大多数属于“整洁的事情”类别.

猜你在找的MsSQL相关文章