MySQLで条件に基づいて値をカウントし、結果を列ごとに表示する方法
MySQLでは、CASE式とSUM関数、GROUP BY句を組み合わせることで、特定の条件に一致するレコード数を数え、その結果を科目ごとなどの異なる列として表示できます。ここでは、学生ごとの科目別出現回数を集計する例を紹介します。
1. サンプルテーブルを作成する
まず、テーブルを作成します。
mysql> create table DemoTable1485
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20),
-> StudentSubject varchar(20)
-> );
Query OK, 0 rows affected (0.72 sec)
2. テストデータを挿入する
次に、INSERT文を使ってレコードを追加します。
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Chris','MySQL');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Robert','MongoDB');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Robert','MongoDB');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1485(StudentName,StudentSubject) values('Chris','Java');
Query OK, 1 row affected (0.12 sec)3. 登録されたデータを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1485;
実行結果は以下のとおりです。
+-----------+-------------+----------------+
| StudentId | StudentName | StudentSubject |
+-----------+-------------+----------------+
| 1 | Chris | MySQL |
| 2 | Robert | MongoDB |
| 3 | Robert | MongoDB |
| 4 | Chris | Java |
+-----------+-------------+----------------+
4 rows in set (0.00 sec)
4. 条件に基づいて件数をカウントするクエリ
ここが本題です。CASE WHENを使って条件に一致する場合に「1」、そうでない場合に「0」を返し、それをSUMで合計することで、学生名ごとの出現回数を科目別に集計できます。
mysql> select StudentSubject,
-> sum(case when StudentName = 'Chris' THEN 1 ELSE 0 END) Chris_Count,
-> sum(case when StudentName = 'Robert' THEN 1 ELSE 0 END) Robert_Count
-> from DemoTable1485
-> group by StudentSubject;
実行すると、次のような結果が得られます。
+----------------+-------------+--------------+
| StudentSubject | Chris_Count | Robert_Count |
+----------------+-------------+--------------+
| MySQL | 1 | 0 |
| MongoDB | 0 | 2 |
| Java | 1 | 0 |
+----------------+-------------+--------------+
3 rows in set (0.00 sec)
ポイントの解説
- CASE式:
StudentName = 'Chris'という条件が真なら1、偽なら0を返します。 - SUM関数: 各グループ内で1の数を合計するため、条件に一致した行数=カウントになります。
- GROUP BY句: 科目(StudentSubject)ごとにグループ化することで、科目別の集計結果を別々の行として表示できます。
この手法は、いわゆる「クロス集計(ピボットテーブル)」を実現する定番の方法です。対象の学生が増えた場合は、同じ形式でCASE式を追加していくだけで、新しい列としてカウント結果を表示できます。なお、MySQL 8.0以降ではCOUNT(CASE WHEN ... THEN 1 END)やCOUNT(IF(...))を使っても同様の結果が得られます。
-
MySQLのCASE WHENで0と1の値を持つ列に条件を設定する方法
MySQLで条件を設定するには、CASE WHENステートメントを使用します。本記事では、0または1の値を持つ複数の列に対して条件を設定し、その合計値に応じてステータスを判定する方法を、具体的なサンプルコードとともに解説します。1. テーブルを作成するまず、CREATE TABLE文でサンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> Value1 int, -> Value2 int, -> Value3 int, -> Value4 int -> );Qu
-
MySQLで条件に応じて同じ列の2つの値を連結する方法
MySQLで条件に応じて同じ列の2つの値を連結する方法 MySQLでは、max() などの集計関数と CASE 式を組み合わせることで、条件の異なる同じ列の値を1つの文字列として連結できます。この記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。 1. サンプルテーブルの作成 まず、create table コマンドでテーブルを作成しましょう。 mysql> create table DemoTable1869 ( Id int, &nb