今天,我阅读了关于在GROUP BY子句中使用多个分组集、多维数据集和汇总子句的技巧。
可以在GROUP BY子句中指定由逗号分隔的多个分组集、多维数据集和汇总子句。通过这样做,就可以获得乘法效果。例如,子句多维数据集(a,b,c)定义八个分组集,子句ROLLUP(x,y,z)定义四个分组集。通过在两者之间指定逗号,如多维数据集(a,b,c),汇总(x,y,z),可以将它们相乘,得到32个分组集。
下面是一个例子。
SELECT
shipcountry, GROUPING(shipcountry) AS grpcountry,
shipcity , GROUPING(shipcity) AS shipcity,
GROUPING_ID( shipcountry, shipcity ) AS grp_id,
COUNT(*) AS numorders
FROM Sales.Orders
GROUP BY CUBE(shipcountry,shipcity), ROLLUP(shipcountry, shipcity)
不能把我的头裹起来。问题是,结果集中有很多重复的行。如果我们在SELECT子句中添加DISTINCT子句,结果集将是相同的,即使没有ROLLUP(shipcountry,shipcity)。这有什么意义呢?
发布于 2015-12-24 19:00:52
我认为当您为多维数据集和rollup子句指定不同的参数时,就会出现实用工具。这一点在你引用的任何消息来源中都很明显。每个多维数据集和汇总都只是较长的分组集列表的快捷方式。在您的示例中,多维数据集定义了以下分组集
而汇总指定了以下设置:
当您在同一个group by子句中指定这两个集合时,您将从第一个组获得每个集合,从第二个组中获得每个集合(这就是您的拉引号所暗示的乘积效应)。因此,您可以得到(使用术语"(x) + (y)“来表示第一组中的项目x和第二组中的项目y):
正如你所看到的,有很多重复的。例如,(船运国、船市)在1、2、3、4、7、8和10中出现7次。
如果您为rollup和多维数据集指定了不同的参数,则会得到一组完全不同的分组集。
最后,请记住我前面说过的话: rollup和cube都是常用的分组模式的快捷方式。如果您只想要某些分组集,请只指定那些带有分组集子句的集合!
https://stackoverflow.com/questions/34450793
复制相似问题