説明
この関数は集計関数であり、各グループに対して小計を返し、すべてのグループに対して合計も返す機能があります。これは GROUP BY ステートメントの単純な拡張であり、データ統計やレポート生成プロセスにおいて、GROUP BY と UNION を組み合わせた方法よりも効率的です。グループ統計に関するタスクでは、ROLLUP 関数を使用することが非常に効率的です。例えば、時間や地理などの階層的な次元に沿って小計を求める場合、ROLLUP(y, m, day) または ROLLUP(country, state, city) のみをクエリするだけで済みます。データウェアハウス管理者は ROLLUP 関数を使用して、集計テーブルのメンテナンスを簡素化し、高速化できます。
ROLLUP 関数の実行順序は以下のとおりです:
パラメータで指定された列に基づいて、右から左へと降順でグループ化します。
各グループに対して小計を求め、さらにすべてのグループに対して合計を求めます。
ORDER BY col1 (,col2,col3,col4 ...)に従ってソートします。
構文
SELECT ... GROUP BY ROLLUP(col_name [,col_name...])
パラメータの説明
col_name はグループ化操作を行う列名を指します。ROLLUP パラメータに N 個の col_name を指定した場合、それは N+1 個の GROUP BY グループの UNION の結合と同じ意味になります。
例
テーブル group_tbl1 を作成し、データを挿入します。
obclient> CREATE TABLE group_tbl1 (group_id INT,job VARCHAR2(10),name VARCHAR2(10),salary INT);
Query OK, 0 rows affected
obclient> INSERT INTO group_tbl1 VALUES
(10,'Coding','Bruce',1000),
(10,'Programmer','Clair',1000),
(20,'Coding','Jason',2000),
(20,'Programmer','Joey',2000),
(30,'Coding','Rebecca',3000),
(30,'Programmer','Rex',3000),
(40,'Coding','Samuel',4000),
(40,'Programmer','Susy',4000);
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM group_tbl1;
+----------+------------+---------+--------+
| GROUP_ID | JOB | NAME | SALARY |
+----------+------------+---------+--------+
| 10 | Coding | Bruce | 1000 |
| 10 | Programmer | Clair | 1000 |
| 20 | Coding | Jason | 2000 |
| 20 | Programmer | Joey | 2000 |
| 30 | Coding | Rebecca | 3000 |
| 30 | Programmer | Rex | 3000 |
| 40 | Coding | Samuel | 4000 |
| 40 | Programmer | Susy | 4000 |
+----------+------------+---------+--------+
8 rows in set
group_id に対して GROUP BY グループ化操作を実行し、salary の合計を求めます。
obclient> SELECT group_id,SUM(salary) FROM group_tbl1 GROUP BY group_id;
+----------+-------------+
| GROUP_ID | SUM(SALARY) |
+----------+-------------+
| 10 | 2000 |
| 20 | 4000 |
| 30 | 6000 |
| 40 | 8000 |
+----------+-------------+
4 rows in set
group_id に対して ROLLUP 関数を使用してグループ化し、同時に salary の合計を求めます。
obclient> SELECT group_id,SUM(salary) FROM group_tbl1 GROUP BY ROLLUP (group_id);
+----------+-------------+
| GROUP_ID | SUM(SALARY) |
+----------+-------------+
| 10 | 2000 |
| 20 | 4000 |
| 30 | 6000 |
| 40 | 8000 |
| NULL | 20000 |
+----------+-------------+
5 rows in set
group_id 列と job 列に対して ROLLUP 関数を使用してグループ化し、同時に salary の合計を求めます。
obclient> SELECT group_id,job,SUM(salary) FROM group_tbl1 GROUP BY ROLLUP (group_id,job);
+----------+------------+-------------+
| GROUP_ID | JOB | SUM(SALARY) |
+----------+------------+-------------+
| 10 | Coding | 1000 |
| 10 | Programmer | 1000 |
| 10 | NULL | 2000 |
| 20 | Coding | 2000 |
| 20 | Programmer | 2000 |
| 20 | NULL | 4000 |
| 30 | Coding | 3000 |
| 30 | Programmer | 3000 |
| 30 | NULL | 6000 |
| 40 | Coding | 4000 |
| 40 | Programmer | 4000 |
| 40 | NULL | 8000 |
| NULL | NULL | 20000 |
+----------+------------+-------------+
13 rows in set
上記のSQLステートメントは、GROUP BY と UNION ALL の組み合わせで置き換えることができます。出力結果は ROLLUP 関数と同じですが、ROLLUP 関数の方がより簡潔で効率的です。
obclient> SELECT group_id,job,SUM(salary) FROM group_tbl1 GROUP BY group_id, job
UNION ALL
SELECT group_id,NULL,SUM(salary) FROM group_tbl1 GROUP BY group_id
UNION ALL
SELECT NULL,NULL,SUM(salary) FROM group_tbl1 ORDER BY 1,2;
+----------+------------+-------------+
| GROUP_ID | JOB | SUM(SALARY) |
+----------+------------+-------------+
| 10 | Coding | 1000 |
| 10 | Programmer | 1000 |
| 10 | NULL | 2000 |
| 20 | Coding | 2000 |
| 20 | Programmer | 2000 |
| 20 | NULL | 4000 |
| 30 | Coding | 3000 |
| 30 | Programmer | 3000 |
| 30 | NULL | 6000 |
| 40 | Coding | 4000 |
| 40 | Programmer | 4000 |
| 40 | NULL | 8000 |
| NULL | NULL | 20000 |
+----------+------------+-------------+
13 rows in set