GROUPING
構文
目的
GROUPING
は、通常のグループ化された行と超集合行を区別します。ROLLUP
やCUBE
などのGROUP
BY
の拡張機能は、すべての値の集合がNULLで表される超集合行を生成します。GROUPING
ファンクションを使用すると、通常の行に含まれるNULLと超集合行ですべての値の集合を表すNULLを区別できます。
GROUPING
ファンクションのexpr
は、GROUP
BY
句の式のいずれかと一致する必要があります。行のexpr
の値がすべての値の集合を表すNULLの場合、このファンクションは1の値を戻します。それ以外の場合は、0(ゼロ)を戻します。GROUPING
ファンクションは、OracleのNUMBER
データ型の値を戻します。これらの用語の詳細は、「SELECT
」の「group_by_clause」を参照してください。
例
次の例では、サンプル表hr.departments
およびhr.employees
で、GROUPING
ファンクションが1(表の通常の行ではなく超集合行)を戻す場合、それ以外の場合に表示されるNULLのかわりに、文字列「All Jobs」が「JOB」列に表示されます。
SELECT DECODE(GROUPING(department_name), 1, 'ALL DEPARTMENTS', department_name) AS department, DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job, COUNT(*) "Total Empl", AVG(salary) * 12 "Average Sal" FROM employees e, departments d WHERE d.department_id = e.department_id GROUP BY ROLLUP (department_name, job_id) ORDER BY department, job; DEPARTMENT JOB Total Empl Average Sal ------------------------------ ---------- ---------- ----------- ALL DEPARTMENTS All Jobs 106 77481.0566 Accounting AC_ACCOUNT 1 99600 Accounting AC_MGR 1 144096 Accounting All Jobs 2 121848 Administration AD_ASST 1 52800 Administration All Jobs 1 52800 Executive AD_PRES 1 288000 Executive AD_VP 2 204000 Executive All Jobs 3 232000 Finance All Jobs 6 103216 Finance FI_ACCOUNT 5 95040 . . .