GROUPING SETS式

GROUPING SETS式を使用すると、GROUP BY句の中で作成するグループのセットを選択して指定できます。

GROUPING SETSは、1つの問合せの中でデータのグルーピングを複数指定するものです。CUBEまたはROLLUPによって生成される集計全体ではなく、指定されたグループのみが集計されます。GROUPING SETSには、1つの要素または要素のリストを指定できます。GROUPING SETSで指定できるグルーピングは、ROLLUPCUBEによって返されるものと等価です。

複数のグルーピング・セットは、指定した状態に対してはサポートされていますが、コーパスに対してはサポートされていません。

GROUPING SETSの構文

GROUPING SETSの構文は次のとおりです。
GROUPING SETS(groupingSetList)
groupingSetListは、単一属性、カンマ区切りの複数属性リスト、CUBEまたはROLLUPです。()を指定すると、空のグループを指定したことになります。空のグループを指定すると、合計が生成されます。グルーピング・セットのネストは許可されません。
次に例を示します。
GROUP BY GROUPING SETS(a, (b), (c, d), ())
複数のグルーピング・セット式が同じ問合せの中に存在できます。
GROUP BY a, GROUPING SETS(b, c), GROUPING SETS((d, e))
これは、次のものと等価です。
GROUP BY GROUPING SETS((a, b, d, e),(a, c, d, e))
()を使用して空のグループを指定したときは、次のものがすべて等価になることに注意してください。
GROUP = GROUP BY() = GROUP BY GROUPING SETS(())
注意: 複数のグルーピング・セットは、コーパスでは使用できません。

グルーピング・セット内の重複する属性の扱い

1つのグルーピング・セットの中で重複する属性を指定する場合、エラーは発生しませんが、その属性のインスタンスのうち1つのみが使用されます。たとえば、この2つの問合せは等価です。
SELECT SUM(PROD_NAME) AS Products GROUP BY PROD_LIST_PRICE, PROD_LIST_PRICE

SELECT SUM(PROD_NAME) AS Products GROUP BY PROD_LIST_PRICE
ただし、別のグルーピング・セットにある重複する属性は使用できます。次の例に示すGROUPING SETSでは、
GROUP BY GROUPING SETS((COUNTRY_TOTAL), (COUNTRY_TOTAL))
COUNTRY_TOTALグループが2つ生成されます。
ただし、この例の場合は、
GROUP BY GROUPING SETS((COUNTRY_TOTAL, COUNTRY_TOTAL))
1つのCOUNTRY_TOTALグループのみが生成されます。両方の属性が同じグルーピング・セット内にあるからです。

GROUPING SETSの例

DEFINE ResellerSales AS
SELECT SUM(DimReseller_AnnualSales) AS TotalSales,
  ARB(DimReseller_ResellerName) AS RepNames,
  DimReseller_OrderMonth AS OrderMonth
GROUP BY OrderMonth;

RETURN MonthlySales AS
SELECT AVG(TotalSales) AS AvgSalesPerRep
FROM ResellerSales
GROUP BY TotalSales, GROUPING SETS(RepNames), GROUPING SETS(OrderMonth)