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、...) の組み合わせです。 同様の規則が、第1のアイテムおよび他のアイテムの各グループ化レベル内で使用される。 最後に、結果セット全体の総計が返されます。
- 小計行の場合、小計がとられる項目に対して 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「従業員」からemp e、dept d
WHERE e.de ptno = d.de ptno
ROLLUPによるグループ (loc, dname, job)
順序1、2、3;
次の出力は、クエリの結果を示しています。 システムは、loc、dname、およびjobの一意の組み合わせごとに従業員の数を計算し、locとdnameの一意の組み合わせごとに、およびlocの一意の値ごとに小計を計算します。 次に、システムは、最終行に表示される総合計を生成する。
loc | dname | 仕事 | 従業員
---------- ---------------------------------------------
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行)
次のクエリは、括弧内の ROLLUP リストの項目を組み合わせる方法を示しています。
SELECT loc、dname、job、COUNT(*) AS「従業員」からemp e、dept d
WHERE e.de ptno = d.de ptno
ROLLUPによるグループ (loc, (dname, job))
順序1、2、3;
次の出力は、クエリの結果を示しています。 結果は、locとdnameの組み合わせに対して小計が生成されないという点で、前の結果とは異なります。
loc | dname | 仕事 | 従業員
---------- ---------------------------------------------
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行)
ROLLUPリストの最初の2つの列が括弧で囲まれている場合、小計レベルは異なります。
SELECT loc、dname、job、COUNT(*) AS「従業員」からemp e、dept d
WHERE e.de ptno = d.de ptno
GROUP BY ROLLUP ((loc, dname), job)
順序1、2、3;
一意のlocとdnameの組み合わせごとに小計が生成されますが、locの一意の値には小計は生成されません。
loc | dname | 仕事 | 従業員
---------- ---------------------------------------------
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行)