ROLLUP 拡張は、各階層グループの小計と総計を含むグループの階層セットを生成します。 階層の順序は、ROLLUP 式リストで指定された式の順序によって決まります。 階層の最上位は、リストの左端のアイテムです。 右側に進む各アイテムは、階層を下に移動します。 右端のアイテムは最下位レベルにあります。
単一の ROLLUP 拡張の構文は次のとおりです。
ROLLUP ( { expr_1 | ( expr_1a [, expr_1b ] ...) }
[, expr_2 | ( expr_2a [, expr_2b ] ...) ] ...)
各 expr は、結果セットのグループ化を決定する式です。 (expr_1a, expr_1b, ...) のように括弧で囲まれた場合、expr_1a と expr_1b によって返される値の組み合わせは、階層の単一のグループ化レベルを定義します。
結果セットで返される集計の基本レベルは、式リストによって返される値の各一意の組み合わせに対応しています。
各一意の値の小計は、リストの最初のアイテムによって返されます。 このアイテムは expr_1 または (expr_1a, expr_1b, ...) の組み合わせにすることができます。 各一意の値の小計は、リストの 2 番目のアイテムによって返されます。 このアイテムは、expr_2 または (expr_2a, expr_2b, ...) の組み合わせにすることができます。 最初のアイテムと他のアイテムの各グループ内でも同様のルールが使用されます。 最後に、結果セット全体の総計が返されます。
小計行の場合、小計がとられる項目に対して null が返されます。
次の例は、GROUP BY 句のコンテキスト内で指定された ROLLUP 拡張を示しています。
SELECT select_list FROM ...
GROUP BY [... ,] ROLLUP ( expression_list ) [, ...]
select_list で指定されたアイテムは、ROLLUP expression_list に表示されるか、COUNT、SUM、AVG、MIN、MAX などの集計関数であるか、返される値がグループ内の個々の行に依存しない定数または SYSDATE 関数などの関数である必要があります。
GROUP BY 句では、複数の ROLLUP 拡張と、他の GROUP BY 拡張の複数の出現および個々の式を指定することができます。
階層構造または意味のある構造で出力を表示する場合は、ORDER BY 句を使用する必要があります。 ORDER BY 句が指定されていない場合は、結果セットの順序は決定されません。
グループ化レベルまたは合計の数は n + 1 で、n は ROLLUP 式リスト内のアイテムの数を表します。 括弧で囲まれたリストは、1 つのアイテムとしてカウントされます。
次のクエリは、loc、dname、 job の列の階層に基づいてロールアップを生成します。
SELECT loc, dname, job, COUNT(*) AS "employees" FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY ROLLUP (loc, dname, job)
ORDER BY 1, 2, 3;
次の例は、このコマンドの実行結果を示しています。 システムは、loc、dname、 job の一意の組み合わせごとに従業員数を計算し、loc と dname の一意の組み合わせごとに、loc の一意の値ごとに小計を計算し、最終行に総計を表示します。
loc | dname | job | employees
----------+------------+-----------+-----------
BOSTON | OPERATIONS | ANALYST | 1
BOSTON | OPERATIONS | CLERK | 1
BOSTON | OPERATIONS | MANAGER | 1
BOSTON | OPERATIONS | | 3
BOSTON | RESEARCH | ANALYST | 2
BOSTON | RESEARCH | CLERK | 2
BOSTON | RESEARCH | MANAGER | 1
BOSTON | RESEARCH | | 5
BOSTON | | | 8
CHICAGO | SALES | CLERK | 1
CHICAGO | SALES | MANAGER | 1
CHICAGO | SALES | SALESMAN | 4
CHICAGO | SALES | | 6
CHICAGO | | | 6
NEW YORK | ACCOUNTING | CLERK | 1
NEW YORK | ACCOUNTING | MANAGER | 1
NEW YORK | ACCOUNTING | PRESIDENT | 1
NEW YORK | ACCOUNTING | | 3
NEW YORK | | | 3
| | | 17
(20 rows)
次のクエリは、括弧内の ROLLUP リストの項目を組み合わせる方法を示しています。
SELECT loc, dname, job, COUNT(*) AS "employees" FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY ROLLUP (loc, (dname, job))
ORDER BY 1, 2, 3;
次の出力では、前回の出力とは異なり、loc と dname の組み合わせに対して小計は生成されません。
loc | dname | job | employees
----------+------------+-----------+-----------
BOSTON | OPERATIONS | ANALYST | 1
BOSTON | OPERATIONS | CLERK | 1
BOSTON | OPERATIONS | MANAGER | 1
BOSTON | RESEARCH | ANALYST | 2
BOSTON | RESEARCH | CLERK | 2
BOSTON | RESEARCH | MANAGER | 1
BOSTON | | | 8
CHICAGO | SALES | CLERK | 1
CHICAGO | SALES | MANAGER | 1
CHICAGO | SALES | SALESMAN | 4
CHICAGO | | | 6
NEW YORK | ACCOUNTING | CLERK | 1
NEW YORK | ACCOUNTING | MANAGER | 1
NEW YORK | ACCOUNTING | PRESIDENT | 1
NEW YORK | | | 3
| | | 17
(16 rows)
ROLLUP リストの最初の 2 列が括弧で囲まれている場合、小計レベルは異なります。
SELECT loc, dname, job, COUNT(*) AS "employees" FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY ROLLUP ((loc, dname), job)
ORDER BY 1, 2, 3;
一意の loc と dname の組み合わせごとに小計が生成されますが、loc の一意の値については小計が生成されません。
loc | dname | job | employees
----------+------------+-----------+-----------
BOSTON | OPERATIONS | ANALYST | 1
BOSTON | OPERATIONS | CLERK | 1
BOSTON | OPERATIONS | MANAGER | 1
BOSTON | OPERATIONS | | 3
BOSTON | RESEARCH | ANALYST | 2
BOSTON | RESEARCH | CLERK | 2
BOSTON | RESEARCH | MANAGER | 1
BOSTON | RESEARCH | | 5
CHICAGO | SALES | CLERK | 1
CHICAGO | SALES | MANAGER | 1
CHICAGO | SALES | SALESMAN | 4
CHICAGO | SALES | | 6
NEW YORK | ACCOUNTING | CLERK | 1
NEW YORK | ACCOUNTING | MANAGER | 1
NEW YORK | ACCOUNTING | PRESIDENT | 1
NEW YORK | ACCOUNTING | | 3
| | | 17
(17 rows)