ROLLUP拡張

ROLLUPは、GROUP BYに対する拡張の1つであり、指定された属性グループの複数レベルの小計を計算できます。総計も計算できます。

ROLLUPは(CUBEと同様に)、GROUPING SETSの糖衣構文です。
ROLLUP(a, b, c) = GROUPING SETS((a,b,c), (a,b), (a), ())
ROLLUPのアクションは小計を作成することであり、この小計は最も詳細なレベルから総計までロールアップされます。これは、ROLLUP句で指定されたグルーピング・リストに従って行われます。ROLLUPは、属性の順序付けリストを引数として受け取り、次のとおりに動作します。
  1. GROUP BY句で指定された標準の集計値を計算します。
  2. 下位から順に小計を作成します。属性リストの右から左へと移動します。
  3. 総計を作成します。
  4. ROLLUPによる処理の最後に、n+1レベルの小計が作成されます。nは属性の数です。

    たとえば、問合せでROLLUPが属性timeregionおよびdepartmentに対して指定されている場合は(n=3)、結果セットには4つの集計レベルの行が出力されます。

要約すると、ROLLUPとは、小計を必要とするタスクで使用するためのものです。

ROLLUPの構文

ROLLUPGROUP BY句の中に出現し、次の構文が使用されます。
GROUP BY ROLLUP(attributeList)
attributeListは単一属性か、カンマ区切りの複数属性リストです。属性は、単一割当て属性または複数割当て属性です。ROLLUPは、指定した状態を含む、コーパスで使用できます。

ROLLUPの例

DEFINE Resellers AS SELECT
  DimReseller_AnnualSales AS Sales,
  DimGeography_CountryRegionName AS Countries,
  DimGeography_StateProvinceName AS States,
  DimReseller_OrderMonth AS OrderMonth
WHERE DimReseller_OrderMonth IS NOT NULL;

RETURN ResellerSales AS
SELECT SUM(Sales) AS TotalSales
FROM Resellers
GROUP BY ROLLUP(Countries, States, OrderMonth)

部分的ROLLUP

一部の小計のみを出力するようにロールアップすることもできます。この部分的ロールアップで使用される構文は次のとおりです。
GROUP BY expr1, ROLLUP(expr2, expr3)

この場合は、GROUP BY句によって(2+1=3)個の集計レベルでの小計が作成されます。つまり、レベル(expr1, expr2, expr3)、(expr1, expr2)および(expr1)です。

前述の例を使用すると、部分的ROLLUPGROUP BY句は次のようになります。
DEFINE Resellers AS SELECT
  ...
RETURN ResellerSales AS
SELECT SUM(Sales) AS TotalSales
FROM Resellers
GROUP BY Countries, ROLLUP(States, OrderMonth)