GROUPING_ID

GROUPING_ID関数は、ROLLUPまたはCUBE句による集計の正確なGROUP BYレベルを示す数値を戻します。

ノート:

ROLLUP句およびCUBE句の詳細は、「GROUP BY句」を参照してください。

GROUPING_ID関数は、ROLLUPまたはCUBEからグループ列の順序付けリストを入力として取得し、次のステップでグループIDを計算します。

  1. GROUPING関数をリストの個々の列に適用します。結果は1および0(ゼロ)の集合で、1はROLLUPまたはCUBEで生成された超集合を示します。

  2. 引数リストの列と同じ順序でこれらの1および0(ゼロ)を配置し、ビット・ベクトルを作成します。

  3. このビット・ベクトルを2進数から10進数に変換します。これがグループIDとして戻されます。

たとえば、CUBE(department_id, job_id)でグループ化すると、戻り値は表4-1のようになります。

表4-1 CUBE(department_id, job_id)でのGROUPING_IDの例

集計レベル ビット・ベクトル GROUPING_ID

部門および職務の通常のグループ行

0 0

0

job_idで集計されたdepartment_idの小計

0 1

1

department_idで集計されたjob_idの小計

1 0

2

総計

1 1

3

GROUPING_ID関数を問合せで使用し、サマリー行のみが表示されるように行をフィルタリングできます。HAVING句でGROUPING_ID関数を使用すると、総計および小計を含む行のみに出力を制限できます。これは、GROUPING_ID関数の比較を追加して、結果がHAVING句で0(ゼロ)よりも大きくなるときに実行できます。

構文

GROUPING_ID関数は、GROUP BY句、GROUPING関数、およびROLLUP句、CUBE句またはGROUPING SETS句のいずれかを含むSELECT文にのみ適用できます。選択リストおよびSELECT問合せのHAVING句で使用できます。

GROUPING_ID(Expression [, Expression ]...)

パラメータ

パラメータ 説明

Expression

有効な式の構文。「式」を参照してください。

次の例では、GROUPING_ID関数にHAVING句のフィルタがあり、戻り値は0(ゼロ)以上になります。小計または総計のいずれかを含まない行は除外されます。次の例では、グループID1で識別される部門の小計、グループID2の職務IDの小計、およびグループID3の総計を示します。

Command> SELECT department_id AS DEPT, job_id AS JOB, 
           GROUPING_ID(department_id, job_id) AS GRP_ID, 
           SUM(salary) AS SALARY 
         FROM emp_details_view 
         GROUP BY CUBE(department_id, job_id) 
         HAVING GROUPING_ID(department_id, job_id) > 0 
         ORDER BY department_id, job_id, grp_id ASC;
 
DEPT, JOB, GRP_ID, SALARY
< 10, <NULL>, 1, 4400 >
< 20, <NULL>, 1, 19000 >
< 30, <NULL>, 1, 24900 >
< 40, <NULL>, 1, 6500 >
< 50, <NULL>, 1, 156400 >
< 60, <NULL>, 1, 28800 >
< 70, <NULL>, 1, 10000 >
< 80, <NULL>, 1, 304500 >
< 90, <NULL>, 1, 58000 >
< 100, <NULL>, 1, 51600 >
< 110, <NULL>, 1, 20300 >
< <NULL>, AC_ACCOUNT, 2, 8300 >
< <NULL>, AC_MGR, 2, 12000 >
< <NULL>, AD_ASST, 2, 4400 >
< <NULL>, AD_PRES, 2, 24000 >
< <NULL>, AD_VP, 2, 34000 >
< <NULL>, FI_ACCOUNT, 2, 39600 >
< <NULL>, FI_MGR, 2, 12000 >
< <NULL>, HR_REP, 2, 6500 >
< <NULL>, IT_PROG, 2, 28800 >
< <NULL>, MK_MAN, 2, 13000 >
< <NULL>, MK_REP, 2, 6000 >
< <NULL>, PR_REP, 2, 10000 >
< <NULL>, PU_CLERK, 2, 13900 >
< <NULL>, PU_MAN, 2, 11000 >
< <NULL>, SA_MAN, 2, 61000 >
< <NULL>, SA_REP, 2, 243500 >
< <NULL>, SH_CLERK, 2, 64300 >
< <NULL>, ST_CLERK, 2, 55700 >
< <NULL>, ST_MAN, 2, 36400 >
< <NULL>, <NULL>, 3, 684400 >
31 rows found.