GROUPING関数

GROUPINGヘルパー関数は、GROUP BYリストの中で指定された属性式が集計されたものかどうかを示します。

GROUPINGGROUPING SETSCUBEおよびROLLUPのヘルパー関数です。GROUPINGは、WHERE句、結合条件、集計関数またはグルーピング属性定義の中で使用できません。

ROLLUPCUBEを使用するときは、次の2つの問題が発生することがあります。
  • 第一に、どの結果セット行が小計であるかをプログラム上でどのように判断し、指定された小計の正確な小計レベルをどのように探し出すかということです。合計に対する割合などを計算する場合に小計がよく必要となるため、どの行が求める小計であるかを判断する簡単な方法が必要です。
  • 問合せの結果に、格納されたNULL値と、ROLLUPまたはCUBEで作成されたNULL値の両方が含まれていたらどうなるか。この2つをどのように区別するかが問題になります。

GROUPING関数を使用すると、このような問題に対処できます。

GROUPINGを使用する目的は、ROLLUPCUBEまたはGROUPING SETSで返されたNULL値と標準のNULL値とを区別することです。ROLLUPCUBEまたはGROUPING SETS操作の結果として返されるNULLは、NULLの特殊な使用法です。これには、結果セット内の列プレースホルダとしての働きがあり、すべての値を意味します。

GROUPINGがTRUEを返すのは、ROLLUPCUBEまたはGROUPING SETS操作で作成されたNULL値が見つかったときです。つまり、行が小計であることをNULLが示している場合は、GROUPINGがTRUEを返します。その他のタイプの値(格納されたNULLも含まれる)の場合は、FALSEが返されます。

したがって、GROUPINGを利用すると、結果セットのどの行が小計であるかをプログラム的に判断でき、特定の小計の集計レベルを正確に知りたいときにも役立ちます。

GROUPINGの構文

GROUPINGの構文は次のとおりです。
GROUPING(attribute)
attributeは単一の属性です。

GROUPINGの例

DEFINE r AS SELECT
  DimReseller_AnnualRevenue AS Revenue,
  DimReseller_AnnualSales AS Sales,
  DimReseller_OrderMonth AS OrderMonth
FROM SaleState;

RETURN results AS SELECT
  COUNT(1) AS COUNT,
  GROUPING(Revenue) AS grouping_Revenue,
  GROUPING(Sales) AS grouping_Sales,
  GROUPING(OrderMonth) AS grouping_OrderMonth
FROM r
GROUP BY
  GROUPING SETS (
    ROLLUP( 
      (Revenue),
      (Sales),
      (OrderMonth)
    )
  )