MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでWITH ROLLUPを正しく使う方法!GROUP BYと組み合わせた集計テクニックを解説

WITH ROLLUPとは?

MySQLのWITH ROLLUPは、GROUP BY句と組み合わせて使用することで、グループごとの集計結果に加えて、全体の合計(総計)行を自動的に追加してくれる便利な機能です。レポート作成やデータ分析の際に、別途合計用のクエリを実行する必要がなくなるため、非常に効率的です。

基本構文

WITH ROLLUPを使用する際の基本的な構文は以下の通りです。

select yourColumnName1,sum(yourColumnName2) from yourTableName
group by yourColumnName1 with rollup;

サンプルテーブルの作成

まず、動作確認用のテーブルを作成しましょう。ここでは従業員の国名と給与を管理するテーブルを用意します。

mysql> create table DemoTable1622
    -> (
    -> EmployeeCountryName varchar(20),
    -> EmployeeSalary int
    -> );
Query OK, 0 rows affected (0.44 sec)

データの挿入

次に、INSERT文を使ってレコードを挿入します。

mysql> insert into DemoTable1622 values('US',4500);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1622 values('UK',1500);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1622 values('AUS',1700);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1622 values('UK',1900);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1622 values('US',3900);
Query OK, 1 row affected (0.42 sec)

登録データの確認

SELECT文でテーブル内のすべてのレコードを表示してみましょう。

mysql> select * from DemoTable1622;

実行結果は以下の通りです。

+---------------------+----------------+
| EmployeeCountryName | EmployeeSalary |
+---------------------+----------------+
| US                  |          4500 |
| UK                  |          1500 |
| AUS                 |          1700 |
| UK                  |          1900 |
| US                  |          3900 |
+---------------------+----------------+
5 rows in set (0.00 sec)

WITH ROLLUPを使った集計クエリ

それでは、MySQLでWITH ROLLUPを正しく使用するクエリを見ていきましょう。

mysql> select EmployeeCountryName,sum(EmployeeSalary) from DemoTable1622
    -> group by EmployeeCountryName with rollup;

実行結果は以下の通りです。

+---------------------+---------------------+
| EmployeeCountryName | sum(EmployeeSalary) |
+---------------------+---------------------+
| AUS                 |                1700 |
| UK                  |                3400 |
| US                  |                8400 |
| NULL                |              13500 |
+---------------------+---------------------+
4 rows in set (0.02 sec)

実行結果の解説

出力結果を見ると、各国ごとの給与合計に加えて、最終行にNULLとして表示される総計行が自動的に追加されていることがわかります。それぞれの数値は以下のように計算されています。

  • AUS:1700
  • UK:1500 + 1900 = 3400
  • US:4500 + 3900 = 8400
  • NULL(全体合計):1700 + 3400 + 8400 = 13500

このように、WITH ROLLUPを使えば、GROUP BYによるグループ別集計と全レコードの合計値を、たった一度のクエリで同時に取得できます。なお、総計行の「NULL」表示が気になる場合は、COALESCE()関数やIFNULL()関数を組み合わせることで、「Total」などの任意のラベルに置き換えることも可能です。

  1. MySQLでCURDATE()とLIKE句を使った部分一致検索の方法

    MySQLにはCONTAINS()という名前の関数は存在しません。そのため、現在の日付(CURDATE())に関連する文字列で部分一致検索を行いたい場合は、CONCAT()関数とLIKE句を組み合わせる方法が有効です。本記事では、実際にサンプルテーブルを作成しながら、その手順を順番に解説していきます。現在の日付を確認するまず、CURDATE()関数を使って現在の日付を取得してみましょう。mysql> select curdate();実行結果は以下の通りです。+------------+ | curdate() | +------------+ | 2019-11-28 | +----

  2. JavaとMySQLでLIKE検索を使う際、検索変数の引用符を正しく記述する方法

    JavaからMySQLに接続し、LIKE句で検索変数(キーワード)を使ったあいまい検索を行う場合、SQL文中の文字列を正しくシングルクォート()で囲むことが重要です。まず、検索変数を使ったLIKE句の正しい構文を見てみましょう。String sqlQuery; sqlQuery = select * from yourTableName where yourColumnName like % + yourSearchVariableName + %;それでは、実際にサンプルテーブルを作成して動作を確認していきます。サンプルテーブルの作成まず、テーブルを作成します。mysql> creat