GROUPING_ID 関数は、GROUPING 関数の実装を簡略化して、ROLLBACK、CUBE、または GROUPING SETS 拡張からの結果セット内の行の小計レベルを決定します。

GROUPING 関数は、列式を 1 つだけ取り、行が指定された列のすべての値の小計であるかどうかを示す値を返します。 複数のグループ化列を持つクエリの小計のレベルを解釈するには、複数の GROUPING 関数が必要になる場合があります。

GROUPING_ID 関数は、ROLLBACK、CUBE、または GROUPING SETS 拡張で使用されている 1 つ以上の列式をサポートし、小計が集計された列を示す単一の整数を返します。

GROUPING_ID 関数の一般的な構文は次のとおりです。

SELECT [ expr ...,]
  GROUPING_ID( col_expr_1 [, col_expr_2 ] ... )
  [, expr ] ...
FROM ...
GROUP BY [...,]
  { ROLLUP | CUBE | GROUPING SETS }( [...,] col_expr_1
  [, col_expr_2 ] [, ...] ) [, ...]

GROUPING_ID 関数は、GROUP BY 句の ROLLUP、CUBE、または GROUPING SETS 拡張の式リストで指定されたディメンション列の式である必要がある 1 つ以上のパラメーターを使用します。

GROUPING_ID 関数は整数値を返します。 この値は、連結された 1 と 0 で構成されるビットベクトルの 10 進数の解釈に対応します。 このビットベクトルは、GROUPING_ID 関数で指定されたパラメーターの順序と同じ左から右の順序で指定された一連の GROUPING 関数によって返されます。

次のクエリは、GROUPING_ID 関数によって返される列 gid の値が、2 つの GROUPING 関数によって返される列 loc および dname の値にどのように対応するかを示しています。

SELECT loc, dname, COUNT(*) AS "employees",
  GROUPING(loc) AS "gf_loc", GROUPING(dname) AS "gf_dname",
  GROUPING_ID(loc, dname) AS "gid"
FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY CUBE (loc, dname)
ORDER BY 6, 1, 2;

次の出力は、ビットベクトルと gid で指定された整数との関係を示しています。 ビットベクトルは、gf_loc 値と gf_dname 値で構成されます。

   loc    |   dname    | employees | gf_loc | gf_dname | gid
----------+------------+-----------+--------+----------+-----
 BOSTON   | OPERATIONS |         3 |      0 |        0 |   0
 BOSTON   | RESEARCH   |         5 |      0 |        0 |   0
 CHICAGO  | SALES      |         6 |      0 |        0 |   0
 NEW YORK | ACCOUNTING |         3 |      0 |        0 |   0
 BOSTON   |            |         8 |      0 |        1 |   1
 CHICAGO  |            |         6 |      0 |        1 |   1
 NEW YORK |            |         3 |      0 |        1 |   1
          | ACCOUNTING |         3 |      1 |        0 |   2
          | OPERATIONS |         3 |      1 |        0 |   2
          | RESEARCH   |         5 |      1 |        0 |   2
          | SALES      |         6 |      1 |        0 |   2
          |            |        17 |      1 |        1 |   3
(12 rows)

次の表に、GROUPING_ID 関数の計算の具体例を示します。 これらの計算は、出力の GROUPING 関数によって返される 4 つの行の値に基づきます。

loc dname ビットベクトル

gf_loc gf_dname

GROUPING_ID

gid

BOSTON OPERATIONS 0 * 2 1 + 0 * 2 0 0
BOSTON null 0 * 2 1 + 1 * 2 0 1
null ACCOUNTING 1 * 2 1 + 0 * 2 0 2
null null 1 * 2 1 + 1 * 2 0 3

次の表は、GROUPING_ID 関数によって返される値が、集計されるグループ化列にどのように対応するかをまとめたものです。

列ごとの集計 ビットベクトル

gf_loc gf_dname

GROUPING_ID

gid

loc, dname 0 0 0
loc 0 1 1
dname 1 0 2
Grand Total 1 1 3

dname でこれらの小計のみを表示するには、GROUPING_ID 関数に基づく HAVING 句がある次の簡略化されたクエリを使用できます。

SELECT loc, dname, COUNT(*) AS "employees",
  GROUPING(loc) AS "gf_loc", GROUPING(dname) AS "gf_dname",
  GROUPING_ID(loc, dname) AS "gid"
FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY CUBE (loc, dname)
HAVING GROUPING_ID(loc, dname) = 2
ORDER BY 6, 1, 2;

次の例は、このクエリの結果を示します。

loc |   dname    | employees | gf_loc | gf_dname | gid
-----+------------+-----------+--------+----------+-----
     | ACCOUNTING |         3 |      1 |        0 |   2
     | OPERATIONS |         3 |      1 |        0 |   2
     | RESEARCH   |         5 |      1 |        0 |   2
     | SALES      |         6 |      1 |        0 |   2
(4 rows)