加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:32:25 所属栏目:MsSql教程 来源:网络整理
导读:我最近了解到有关GROUPING SETS,CUBE和ROLLUP在SQL Server中定义多个分组集. 我在问什么是在什么情况下使用这些功能?使用它们的好处和优点是什么? SELECT shipperid,YEAR(shippeddate) AS shipyear,COUNT(*) AS numordersFROM Sales.OrdersGROUP BY GROUPIN
我最近了解到有关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示例进行比较,该示例将提供完全相同的结果,但使用效率较低的执行计划(两个表扫描而不是一个).

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读