GROUPING SETS の対応

GROUP BY 句で GROUPING SETS を使用すると、複数の単純な 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 一覧として指定すると、グループ セットのそれぞれが GROUP BY 一覧であるクエリの UNION ALL と同じ結果が得られます。浮動小数点数を集計すると、若干異なる結果が返される場合があります。

次のステートメントは同等です。

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 ()

次の句は同じ 1 つのセットを返します。

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

GROUPING SETS ROLLUP の対応

入力一覧に n ディメンションを含む GROUP BY ROLLUP (<複合要素一覧>) は、入力一覧の各プレフィックス (n+1) が GROUPING SETS である 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 (<複合要素一覧>) は、入力一覧のフル セット (入力一覧内のディメンションの 2n の組み合わせ) が GROUPING SETS である 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 の複合列

次の句は同等です。

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

CUBE 内にグループ セットを含む 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) () )