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

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(...))を使っても同様の結果が得られます。

  1. 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

  2. MySQLで条件に応じて同じ列の2つの値を連結する方法

    MySQLで条件に応じて同じ列の2つの値を連結する方法 MySQLでは、max() などの集計関数と CASE 式を組み合わせることで、条件の異なる同じ列の値を1つの文字列として連結できます。この記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。 1. サンプルテーブルの作成 まず、create table コマンドでテーブルを作成しましょう。 mysql> create table DemoTable1869     (     Id int,   &nb