GROUP BY
節は、要約出力に行を追加する
WITH ROLLUP
修飾子を許可します。これらの行は、高レベル
(または超集約)
の要約演算を表します。したがって
ROLLUP
は、複数レベルでの解析で質問に単一クエリーで答えることを可能にします。これは、たとえば、OLAP
(Online Analytical Processing)
演算へのサポートに使用することができます。
Sales
と名付けられたテーブルが、売り上げの収益性を記録するために、year
、country
、product
、そして
profit
のカラムを持つ場合 :
CREATE TABLE sales ( year INT NOT NULL, country VARCHAR(20) NOT NULL, product VARCHAR(32) NOT NULL, profit INT );
テーブルのコンテンツを、次のように簡単な
GROUP BY
で年ごとに要約することができます :
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;
+------+-------------+
| year | SUM(profit) | +------+-------------+ | 2000 | 4525 | | 2001
| 3010 | +------+-------------+
この出力は各年の収益合計を表示しますが、すべての年にわたる収益合計を確認したい場合は、各値を自分で合計するか、別のクエリーを実行する必要があります。
または、単一クエリーで両方のレベルの解析を提供する
ROLLUP
を使用することもできます。GROUP
BY
節に WITH
ROLLUP
修飾子を加えると、クエリーがすべての年にわたる総合計の値を示す行を生成します
:
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;
+------+-------------+ | year | SUM(profit) | +------+-------------+ | 2000
| 4525 | | 2001 | 3010 | | NULL | 7535 | +------+-------------+
総合計の超集約ラインは、year
カラムの値 NULL
によって特定されます。
ROLLUP
は、複数の
GROUP BY
カラムがある場合に、さらに複雑な効果をあらわします。この場合、「break」
(値の変更)
が最後のグループ分けのカラムにある度に、クエリーは追加の超集約要約行を生成します。
たとえば、ROLLUP
なしの場合、year
、country
、そして
product
を基にした
sales
テーブルの要約はこのようになる場合があります
:
mysql>SELECT year, country, product, SUM(profit)
->FROM sales
->GROUP BY year, country, product;
+------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | | 2000 | USA | Calculator | 75 | | 2000 | USA | Computer | 1500 | | 2001 | Finland | Phone | 10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | +------+---------+------------+-------------+
この出力は year/country/product
レベルでのみの解析での要約値を示します。ROLLUP
が加えられるとき、クエリーは複数の追加行を生成します
:
mysql>SELECT year, country, product, SUM(profit)
->FROM sales
->GROUP BY year, country, product WITH ROLLUP;
+------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | Finland | NULL | 1600 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | | 2000 | India | NULL | 1350 | | 2000 | USA | Calculator | 75 | | 2000 | USA | Computer | 1500 | | 2000 | USA | NULL | 1575 | | 2000 | NULL | NULL | 4525 | | 2001 | Finland | Phone | 10 | | 2001 | Finland | NULL | 10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | | 2001 | USA | NULL | 3000 | | 2001 | NULL | NULL | 3010 | | NULL | NULL | NULL | 7535 | +------+---------+------------+-------------+
このクエリーでは、ROLLUP
節を加えると、ひとつでなく、よっつの解析のレベルでの要約情報が出力に含まれます。次に
ROLLUP
出力の解釈方法を示します。
指定の year と country に対する product
行の各セットに続き、追加の要約行がすべての
product
の合計を示して生成されます。これらの行は
NULL
に対して
product
カラムセットを備えています。
指定の year に対する product
行の各セットに続き、追加の要約行がすべての
country と product
の合計を示して生成されます。これらの行は
NULL
に対して
country
および
products
カラムセットを備えています。
そして最後に、ほかのすべての行に続き、追加の要約行がすべての
year 、country 、および product
の総合系を示して生成されます。この行は
NULL
に対して
year
、country
および
products
カラムセットを備えています。
ROLLUP
を使用する際のその他の注意
次の項目は、ROLLUP
の
MySQL 実装特定の動作をリストしたものです :
ROLLUP
を使用する場合、ORDER
BY
節を同時に使用して結果をソートすることはできません。つまり、ROLLUP
と ORDER BY
は互いに排し合うということになります。しかし、ソートの順番をいくらかコントロールすることは可能です。MySQL
の GROUP BY
が結果をソートし、そして明示的な
ASC
および
DESC
キーワードを
GROUP BY
内で名付けられたカラムと使用し、各カラムのソート順を指定することができます。(しかし、ROLLUP
によって加えられた高レベルな要約行は、ソート順に関わらず、それらが計算された行の後に現れます)。
LIMIT
はクライアントに戻される行の数を限定するのに使用できます。LIMIT
は ROLLUP
の後に適用され、それによって
ROLLUP
によって追加された行に対しての制限が適用されます。例
:
mysql>SELECT year, country, product, SUM(profit)
->FROM sales
->GROUP BY year, country, product WITH ROLLUP
->LIMIT 5;
+------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | Finland | NULL | 1600 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | +------+---------+------------+-------------+
LIMIT
を
ROLLUP
と使用すると、超集約行を理解するにはコンテキストが少ないため、より解釈が難しい結果を生成する場合があります。
各超集約行の NULL
指示子は、行がクライアントに送られたときに生成されます。サーバーは、GROUP
BY
節で名付けられたカラムを、変更値を持つ左側のものに続いて調査します。それらの名前に語彙がマッチした名称を持つ、結果セット内のすべてのカラムには、その値が
NULL
に設定されます。(カラム番号によってグループ分けのカラムを指定する場合、サーバーは番号によってどのカラムを
NULL
に設定するかを確認します)。
超集約行の NULL
値は、クエリーの処理の非常に遅い時点で結果セットに配置されるため、それらをクエリーそのものの中で
NULL
値としてテストすることはできません。たとえば、クエリーに
HAVING product IS NULL
を追加して、超集約行以外のすべての出力から除くことはできません。
一方、NULL
値はクライアント側には
NULL
として表れ、MySQL
クライアントプログラミングインタフェースのいずれかを使用してテストすることができます。