首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用多个分组集、多维数据集和汇总子句按组分组

使用多个分组集、多维数据集和汇总子句按组分组
EN

Stack Overflow用户
提问于 2015-12-24 09:54:16
回答 1查看 1K关注 0票数 1

今天,我阅读了关于在GROUP BY子句中使用多个分组集、多维数据集和汇总子句的技巧。

可以在GROUP BY子句中指定由逗号分隔的多个分组集、多维数据集和汇总子句。通过这样做,就可以获得乘法效果。例如,子句多维数据集(a,b,c)定义八个分组集,子句ROLLUP(x,y,z)定义四个分组集。通过在两者之间指定逗号,如多维数据集(a,b,c),汇总(x,y,z),可以将它们相乘,得到32个分组集。

下面是一个例子。

代码语言:javascript
运行
复制
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)。这有什么意义呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 19:00:52

我认为当您为多维数据集和rollup子句指定不同的参数时,就会出现实用工具。这一点在你引用的任何消息来源中都很明显。每个多维数据集和汇总都只是较长的分组集列表的快捷方式。在您的示例中,多维数据集定义了以下分组集

  1. 船主国,船城
  2. 船国
  3. 船运城市
  4. (空)

而汇总指定了以下设置:

  1. 船主国,船城
  2. 船国
  3. (空)

当您在同一个group by子句中指定这两个集合时,您将从第一个组获得每个集合,从第二个组中获得每个集合(这就是您的拉引号所暗示的乘积效应)。因此,您可以得到(使用术语"(x) + (y)“来表示第一组中的项目x和第二组中的项目y):

  1. (1) + (1)→(船主国,船城)+(船主国,船城)→(船运国,船城)
  2. (1) + (2)→(船国,船城)+(船国)→(船运国,船城)
  3. (1) + (3)→(船国,船城)+((空))→(船运国,船城)
  4. (2) + (1)→(船主国)+(船主国,船城)→(船运国,船城)
  5. (2) + (2)→(船国)+(船国)→(船国)
  6. (2) + (3)→(船国)+((空))→(船运国)
  7. (3) + (1)→(船城)+(船运国,船城)→(船运国,船城)
  8. (3) + (2)→(船务城市)+(船运国)→(船运国)
  9. (3) + (3)→(托运人)+ ((null))→(船运城市)
  10. (4) + (1)→((null)) +(船主国,船城)→(船运国,船城)
  11. (4) + (2)→((null)) +(托运人)→(托运人)
  12. (4) + (3)→((Null)+ ((null))→((null))

正如你所看到的,有很多重复的。例如,(船运国、船市)在1、2、3、4、7、8和10中出现7次。

如果您为rollup和多维数据集指定了不同的参数,则会得到一组完全不同的分组集。

最后,请记住我前面说过的话: rollup和cube都是常用的分组模式的快捷方式。如果您只想要某些分组集,请只指定那些带有分组集子句的集合!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34450793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档