具有多个GROUPING SETS,CUBE和ROLLUP子句的GROUP BY

时间:2015-12-24 09:54:17

标签: sql-server tsql group-by

今天我已经阅读了关于在GROUP BY子句中使用多个GROUPING SETS,CUBE和ROLLUP子句的提示。

  

您可以在中指定多个GROUPING SETS,CUBE和ROLLUP子句   GROUP BY子句用逗号分隔。通过这样做,你实现了   乘法效应。例如,CUBE(a,b,c)子句定义   八个分组集和子句ROLLUP(x,y,z)定义了四个   分组集。通过在两者之间指定逗号,如在CUBE(a,b,   c),ROLLUP(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)

不能把头包裹起来。问题是,结果集中有很多重复的行。如果我们将DISTINCT添加到SELECT子句,即使没有ROLLUP(shipcountry,shipcity),结果集也是相同的。重点是什么?

1 个答案:

答案 0 :(得分:2)

我认为在为cube和rollup子句指定不同的参数时会出现该实用程序。无论你引用什么来源,这都是显而易见的。立方体和汇总中的每一个都只是较长的分组集列表的快捷方式。在您的示例中,多维数据集定义了以下分组集

  1. shipcountry,shipcity
  2. 货主国家
  3. 货主国家
  4. (空)
  5. 汇总指定了这些集合:

    1. shipcountry,shipcity
    2. 货主国家
    3. (空)
    4. 当您在同一group by子句中指定两者时,您将从第一组中获取每组与第二组中的每一组(这是拉引号的乘法效应所暗示的)。所以你得到(使用命名法“(x)+(y)”来表示“第一组中的项目x和第二组中的项目y”:

      1. (1)+(1)→(shipcountry,shipcity)+(shipcountry,shipcity)→(shipcountry,shipcity)
      2. (1)+(2)→(shipcountry,shipcity)+(shipcountry)→(shipcountry,shipcity)
      3. (1)+(3)→(shipcountry,shipcity)+((null))→(shipcountry,shipcity)
      4. (2)+(1)→(shipcountry)+(shipcountry,shipcity)→(shipcountry,shipcity)
      5. (2)+(2)→(shipcountry)+(shipcountry)→(shipcountry)
      6. (2)+(3)→(shipcountry)+((null))→(shipcountry)
      7. (3)+(1)→(shipcity)+(shipcountry,shipcity)→(shipcountry,shipcity)
      8. (3)+(2)→(shipcoun)+(shipcountry)→(shipcountry,shipcity)
      9. (3)+(3)→(shipcity)+((null))→(shipcity)
      10. (4)+(1)→((null))+(shipcountry,shipcity)→(shipcountry,shipcity)
      11. (4)+(2)→((null))+(shipcountry)→(shipcountry)
      12. (4)+(3)→((null))+((null))→((null))
      13. 正如您所看到的,有很多重复。例如,(shipcountry,shipcity)在1,2,3,4,7,8和10中显示七次。

        如果您为汇总和多维数据集指定了不同的参数,那么您将获得一组完全不同的分组集。

        最后,请记住我上面所说的:汇总和立方体都是常用的分组集模式的快捷方式。如果您只想要某些分组集,请仅指定具有分组集子句的那些!