GROUPING SETS 等效项

使用 GROUPING SETS 的 GROUP BY 子句可以生成一个等效于由多个简单 GROUP BY 子句的 UNION ALL 生成的结果集。GROUPING SETS 可以生成等效于由简单 GROUP BY、ROLLUP 或 CUBE 操作生成的结果。GROUPING SETS、ROLLUP 或 CUBE 的不同组合可以生成等效的结果集。

本主题提供了 GROUPING SETS 等效项的示例。这些示例中使用了以下缩写:

  • Agg():任何聚合函数

  • (arg):参数

UNION ALL 的 GROUPING SETS 等效项

指定 GROUPING SETS (<分组集> [,...n]) 作为 GROUP BY 列表等效于查询的 UNION ALL,其中每个查询将其中一个分组集作为其 GROUP BY 列表。浮点数的聚合返回的结果可能会略有不同。

以下语句是等效的:

SELECT customer, year, SUM(sales)
FROM T
GROUP BY GROUPING SETS ((customer), (year))
SELECT customer, NULL as year, SUM(sales)
FROM T 
GROUP BY customer
UNION ALL
SELECT NULL as customer, year, SUM(sales)
FROM T 
GROUP BY year

简单 GROUP BY 的 GROUPING SETS 等效项

以下子句可返回相同的总计:

GROUP BY GROUPING SETS ( () )
GROUP BY ()

以下子句可返回相同的单个结果集:

GROUP BY GROUPING SETS ( (C1, C2, ..., Cn) )
GROUP BY C1, C2, ..., Cn

GROUPING SETS ROLLUP 等效项

输入列表为 n 维的 GROUP BY ROLLUP (<组合元素列表>) 等效于这样的 GROUPING SETS,其中使用其输入列表的所有前缀 (n+1) 作为其 GROUPING SETS。

以下子句是等效的:

GROUP BY ROLLUP (C1, C2, …, Cn-1, Cn)
GROUP BY GROUPING SETS ( (C1, C2, …, Cn-1, Cn)
    ,(C1, C2, ..., Cn-1)
    ...
    ,(C1, C2)
    ,(C1)
    ,() )

GROUPING SETS CUBE 等效项

输入列表为 n 维的 GROUP BY CUBE (<组合元素列表>) 等效于这样的 GROUPING SETS,其中使用其输入列表的全集(输入列表中维度的 2n 个组合)作为其 GROUPING SETS。

以下子句是等效的:

GROUP BY CUBE (C1, C2, C3, ..., Cn-2, Cn-1, Cn)
GROUP BY GROUPING SETS (
     (C1, C2, C3, ..., Cn-2, Cn-1, Cn) -- All dimensions are included.
    ,( , C2, C3, ..., Cn-2, Cn-1, Cn) -- n-1 dimensions are included.
    ,(C1, C3, ..., Cn-2, Cn-1, Cn)
    …
    ,(C1, C2, C3, ..., Cn-2, Cn-1,)
    ,(C3, ..., Cn-2, Cn-1, Cn) -- n-2 dimensions included
    ,(C1  ..., Cn-2, Cn-1, Cn)
    …
    ,(C1, C2) -- 2 dimensions are included.
    ,…
    ,(C1, Cn)
    ,…
    ,(Cn-1, Cn)
    ,…
    ,(C1) -- 1 dimension included
    ,(C2)
    ,…
    ,(Cn-1)
    ,(Cn)
    ,() ) -- Grand total, 0 dimension is included.

以下子句是等效的:

GROUP BY CUBE (C1, C2, C3)
GROUP BY GROUPING SETS ( (C1, C2, C3)
    ,(C1, C2)
    ,(C1, C3)
    ,(C2, C3)
    ,(C1)
    ,(C2)
    ,(C3)
    ,() )

内部包含分组集的 ROLLUP 中的组合列

以下子句是等效的:

ROLLUP(A, (C1, C2, ..., Cn) )
ROLLUP( (A), (C1, C2, ..., Cn) )
GROUPING SETS ( (A, C1, C2, ..., Cn), (A), () )

内部包含分组集的 CUBE 中的组合列

以下子句是等效的:

CUBE(A, (C1, C2, ..., Cn) )
CUBE( (A), (C1, C2, ..., Cn) )
GROUPING SETS ( (), (A), (C1, C2, ..., Cn), (A, C1, C2, ..., Cn) )

包含 GROUPING SETS、ROLLUP 或 CUBE 的 GROUP BY

以下子句是等效的:

GROUP BY A, CUBE (B, C)
GROUP BY GROUPING SETS ( (A), (A, B), (A, C), (A, B, C ))

以下子句是等效的:

GROUP BY A, GROUPING SETS ( (B), (C) )
GROUP BY GROUPING SETS ( (A, B), (A, C) )

以下子句是等效的:

GROUP BY ROLLUP (A, B), ROLLUP(C, D)
GROUP BY GROUPING SETS
    ( (),(C),(C,D),(A),(A,C),(A,C,D),(A,B),(A,B,C),(A,B,C,D) )

包含在 GROUPING SETS 列表中的 ROLLUP

以下子句是等效的:

GROUP BY GROUPING SETS ( (A), ROLLUP (B, C) )
GROUP BY GROUPING SETS ( (A), (B,C), (B), () )

包含在分组集中的 ROLLUP

以下子句是等效的:

GROUP BY GROUPING SETS(A, (B, ROLLUP(C, D)) )
GROUP BY GROUPING SETS (A, B, (B,C), (B, C, D) () )