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

MySQLで複数の列をGROUP BYする方法|IF()関数を使ったクエリの書き方

MySQLでは、IF()関数を活用することで、複数の列を組み合わせたGROUP BY処理を実現できます。この記事では、実際にテーブルを作成し、サンプルデータを使いながら複数列のグループ化の方法を詳しく解説します。

サンプルテーブルの作成

まず、動作を確認するためのテーブルを作成しましょう。テーブル作成のクエリは以下の通りです。

mysql> create table MultipleGroupByDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> CustomerId int,
    -> ProductName varchar(100)
    -> );
Query OK, 0 rows affected (0.59 sec)

このテーブルは、自動採番のId、顧客IDを表すCustomerId、商品名を格納するProductNameの3つの列で構成されています。

テストデータの挿入

次に、INSERTコマンドを使ってテーブルにレコードを挿入します。クエリは以下の通りです。

mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1000,'Product-1');
Query OK, 1 row affected (0.20 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1001,'Product-2');
Query OK, 1 row affected (0.18 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1001,'Product-2');
Query OK, 1 row affected (0.16 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1001,'Product-2');
Query OK, 1 row affected (0.12 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1002,'Product-3');
Query OK, 1 row affected (0.09 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1002,'Product-3');
Query OK, 1 row affected (0.15 sec)
mysql> insert into MultipleGroupByDemo(CustomerId,ProductName) values(1003,'Product-4');
Query OK, 1 row affected (0.16 sec)

同じ顧客が同じ商品を複数回購入しているデータも含まれている点に注目してください。この重複データが、グループ化の挙動を確認するうえで重要になります。

挿入したデータの確認

SELECT文を使って、テーブル内のすべてのレコードを表示します。

mysql> select *from MultipleGroupByDemo;

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

+----+------------+-------------+
| Id | CustomerId | ProductName |
+----+------------+-------------+
|  1 |       1000 | Product-1   |
|  2 |       1001 | Product-2   |
|  3 |       1001 | Product-2   |
|  4 |       1001 | Product-2   |
|  5 |       1002 | Product-3   |
|  6 |       1002 | Product-3   |
|  7 |       1003 | Product-4   |
+----+------------+-------------+
7 rows in set (0.00 sec)

合計7件のレコードが登録されています。顧客1001は「Product-2」を3回、顧客1002は「Product-3」を2回購入していることがわかります。

複数の列をGROUP BYするクエリ

それでは、本題である複数列のGROUP BYクエリを見ていきましょう。ProductNameCustomerIdの2つの列でグループ化しつつ、IF()関数で条件判定を行う例です。

mysql> SELECT CustomerId, if( ProductName = 'Product-2', 1, 0 )
    -> FROM MultipleGroupByDemo
    -> GROUP BY ProductName , CustomerId;

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

+------------+---------------------------------------+
| CustomerId | if( ProductName = 'Product-2', 1, 0 ) |
+------------+---------------------------------------+
|       1000 |                                     0 |
|       1001 |                                     1 |
|       1002 |                                     0 |
|       1003 |                                     0 |
+------------+---------------------------------------+
4 rows in set (0.00 sec)

このクエリでは、ProductNameが「Product-2」であれば1を、そうでなければ0を返すIF()関数を使用しています。グループ化の結果、7件のレコードが4件にまとめられていることが確認できます。

代替クエリ:MAX()とIF()の組み合わせ

同じ結果を得るための別のアプローチとして、MAX()関数とIF()関数を組み合わせる方法もあります。こちらはCustomerIdのみでグループ化する点が特徴です。

mysql> select CustomerId,MAX(IF(ProductName = 'Product-2', 1,0)) from MultipleGroupByDemo group by CustomerId;

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

+------------+-----------------------------------------+
| CustomerId | MAX(IF(ProductName = 'Product-2', 1,0)) |
+------------+-----------------------------------------+
|       1000 |                                       0 |
|       1001 |                                       1 |
|       1002 |                                       0 |
|       1003 |                                       0 |
+------------+-----------------------------------------+
4 rows in set (0.00 sec)

MAX(IF(条件, 1, 0))という書き方は、特定の条件に該当するレコードがグループ内に1件でも存在すれば1を返す、いわゆる「フラグ判定」の定番テクニックです。この例では、顧客1001だけが「Product-2」を購入しているため、その行のみ1が表示されています。

まとめ

MySQLで複数の列をGROUP BYする場合は、GROUP BY句に複数の列をカンマ区切りで指定するだけで実現できます。さらにIF()関数やMAX()関数と組み合わせることで、条件に応じたフラグ判定や集計処理を柔軟に行うことが可能です。顧客ごとの購買傾向の分析など、実務でも活用シーンの多いテクニックなので、ぜひマスターしておきましょう。

  1. 1つのMySQLクエリで複数のカラムのデータ型を変更する方法

    MySQLでは、ALTER TABLE文を使うことで、テーブルのカラム定義を後から変更できます。複数のカラムのデータ型を一度に変更したい場合も、1つのクエリでまとめて実行可能です。基本構文単一のクエリで複数のカラムの型を変更するには、以下のように MODIFY COLUMN をカンマで区切って並べます。ALTER TABLE テーブル名 MODIFY COLUMN カラム名1 データ型1, MODIFY COLUMN カラム名2 データ型2, . . N;サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable (

  2. MySQLで1つのクエリを使って複数の列をまとめて並べ替える方法

    MySQLで複数の列の値を比較しながらレコードを並べ替えたい場合は、ORDER BY GREATEST()を使用します。GREATEST()は指定した複数の列の中から最も大きい値を返す関数であり、その値を基準にソートを行うことができます。それでは、実際にサンプルテーブルを作成して確認していきましょう。1. テーブルの作成まず、3つのint型カラムを持つテーブルを作成します。mysql> create table DemoTable1395    -> (    -> Value1 int,&nbs