MySQLの単一クエリで複数のCOUNT()を取得する方法(CASE式の活用)
MySQLでは、CASE文をCOUNT関数と組み合わせることで、1つのクエリ内で複数の条件別カウントを同時に取得できます。通常、条件ごとに個別のクエリを実行する必要がありますが、CASE式を使えばテーブルへのアクセスが1回で済み、パフォーマンス面でも有利になります。
この記事では、実際にテーブルを作成し、単一のSELECT文で複数のCOUNT()結果を取得する手順を解説します。
1. サンプルテーブルの作成
まず、姓(LastName)を格納するシンプルなテーブルを作成しましょう。
mysql> create table DemoTable
-> (
-> LastName varchar(100)
-> );
Query OK, 0 rows affected (0.60 sec)
2. テストデータの挿入
INSERTコマンドを使って、いくつかのレコードを登録します。同じ姓が複数回登場するようにデータを用意しています。
mysql> insert into DemoTable values('Smith');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('Brown');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('Brown');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Smith');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Taylor');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Taylor');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Miller');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Miller');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Miller');
Query OK, 1 row affected (0.12 sec)3. 登録データの確認
SELECT文ですべてのレコードを表示して、データが正しく登録されているか確認します。
mysql> select *from DemoTable;
出力結果
+----------+
| LastName |
+----------+
| Smith |
| Brown |
| Brown |
| Smith |
| Taylor |
| Taylor |
| Miller |
| Miller |
| Miller |
+----------+
9 rows in set (0.00 sec)
合計9件のレコードが登録されています。「Smith」と「Brown」が2件ずつ、「Taylor」が2件、「Miller」が3件です。
4. CASE文を使った複数COUNT()クエリ
ここが本題です。以下のようにCOUNT(CASE WHEN 条件 THEN 1 END)の形式を使うことで、1つのクエリで複数の条件別カウントを同時に取得できます。
mysql> select COUNT(CASE WHEN LastName='Smith' THEN 1 END) AS SmithCount,
-> COUNT(CASE WHEN LastName='Brown' THEN 1 END) AS BrownCount,
-> COUNT(CASE WHEN LastName='Taylor' THEN 1 END) AS TaylorCount,
-> COUNT(CASE WHEN LastName='Miller' THEN 1 END) AS MillerCount
-> from DemoTable;
出力結果
+------------+------------+-------------+-------------+
| SmithCount | BrownCount | TaylorCount | MillerCount |
+------------+------------+-------------+-------------+
| 2 | 2 | 2 | 3 |
+------------+------------+-------------+-------------+
1 row in set (0.00 sec)
仕組みの解説
CASE式は、条件(例:LastName='Smith')が真の場合に「1」を返し、偽の場合はNULLを返します。COUNT関数はNULLを無視して非NULLの値のみを数えるため、結果として各条件に一致する行数だけがカウントされるのです。
この手法は「条件付き集計(Conditional Aggregation)」と呼ばれ、ダッシュボード用の統計取得やレポート生成など、複数の集計値を一度に必要とする場面で非常に役立ちます。また、GROUP BY句と組み合わせれば、カテゴリごとの横持ち集計(ピボット集計)にも応用できます。
-
MySQLのUPDATE文で1つのクエリを使って複数のレコードを更新する方法
MySQLでは、UPDATEステートメントを使うことで、1つのクエリで複数のカラムや複数のレコードの値をまとめて更新できます。この記事では、実際にサンプルテーブルを作成し、UPDATE文でデータを更新する具体的な手順を解説します。サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, &
-
【MySQL】SUM()関数を使って単一クエリで特定の列値ごとの複数カウントを取得する方法
特定の列値に基づくカウントを1つのMySQLクエリで複数取得するには、集計関数SUM()を活用します。MySQLでは「列 = 値」という条件式が真なら1、偽なら0を返すため、その結果をSUM()で合計することで、条件に一致する行数を数えられます。まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable1790 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Name varchar(20), Score int ); Query OK, 0 rows af