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クエリを見ていきましょう。ProductNameとCustomerIdの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つのMySQLクエリで複数のカラムのデータ型を変更する方法
MySQLでは、ALTER TABLE文を使うことで、テーブルのカラム定義を後から変更できます。複数のカラムのデータ型を一度に変更したい場合も、1つのクエリでまとめて実行可能です。基本構文単一のクエリで複数のカラムの型を変更するには、以下のように MODIFY COLUMN をカンマで区切って並べます。ALTER TABLE テーブル名 MODIFY COLUMN カラム名1 データ型1, MODIFY COLUMN カラム名2 データ型2, . . N;サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable (
-
MySQLで1つのクエリを使って複数の列をまとめて並べ替える方法
MySQLで複数の列の値を比較しながらレコードを並べ替えたい場合は、ORDER BY GREATEST()を使用します。GREATEST()は指定した複数の列の中から最も大きい値を返す関数であり、その値を基準にソートを行うことができます。それでは、実際にサンプルテーブルを作成して確認していきましょう。1. テーブルの作成まず、3つのint型カラムを持つテーブルを作成します。mysql> create table DemoTable1395 -> ( -> Value1 int,&nbs