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

MySQLで同一IDごとに「Yes」「No」など異なる値のレコード数を集計する方法

MySQLでは、SUM()関数と条件式を組み合わせることで、同じIDに紐づく複数のレコードから、値ごと(例:「Yes」「No」)の件数を簡単に集計できます。ここでは、従業員IDごとに結婚状況(isMarried)の「YES」と「NO」の数を数える具体例を紹介します。

1. サンプルテーブルの作成

まず、集計用のテーブルを作成します。婚姻状態はENUM型で「YES」「NO」のいずれかを持つものとします。

mysql> create table DemoTable1430
    -> (
    -> EmployeeId int,
    -> isMarried ENUM('YES','NO')
    -> );
Query OK, 0 rows affected (0.60 sec)

2. レコードの挿入

INSERT文を使って、同じ従業員ID(1001)に対して複数のレコードを追加します。

mysql> insert into DemoTable1430 values(1001,'Yes');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1430 values(1001,'No');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1430 values(1001,'Yes');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1430 values(1001,'Yes');
Query OK, 1 row affected (0.16 sec)

3. データの確認

SELECT文で登録されたすべてのレコードを表示してみましょう。

mysql> select * from DemoTable1430;

実行すると、次のような結果が得られます。

+------------+-----------+
| EmployeeId | isMarried |
+------------+-----------+
|      1001 | YES       |
|      1001 | NO        |
|      1001 | YES       |
|      1001 | YES       |
+------------+-----------+
4 rows in set (0.00 sec)

4. 「Yes」「No」の件数を集計するクエリ

ここが本題です。SUM()と比較条件を組み合わせることで、各値の件数を一度に取得できます。ポイントは、isMarried='Yes'のような条件式が真なら1、偽なら0を返すため、その合計がそのまま該当件数になるという仕組みです。

mysql> select EmployeeId,sum(isMarried='Yes') as NumberOfMarried,
    -> sum(isMarried='No') as NumberOfUnMarried
    -> from DemoTable1430
    -> group by EmployeeId;

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

+------------+-----------------+-------------------+
| EmployeeId | NumberOfMarried | NumberOfUnMarried |
+------------+-----------------+-------------------+
|      1001 |               3 |             1 |
+------------+-----------------+-------------------+
1 row in set (0.00 sec)

まとめ

GROUP BYSUM()を組み合わせれば、CASE文を明示的に書かなくても、ブール式の合計によって値ごとの件数を効率的に集計できます。より可読性を重視したい場合は、SUM(CASE WHEN isMarried='Yes' THEN 1 ELSE 0 END)のようにCASE式を使った書き方もおすすめです。この手法は、「承認/却下」「有効/無効」など、二値のステータスを持つデータの統計処理全般に応用できます。

  1. MySQLで同じIDを持つレコードを特殊文字区切りで1行に連結するクエリ(CONCAT_WS+GROUP_CONCAT)

    同じIDを持つ複数のレコードを、特殊文字で区切りながら1行にまとめて連結したい場合には、CONCAT_WS()とGROUP_CONCAT()を組み合わせて使用するのが効果的です。この記事では、実際にテーブルを作成し、レコードを連結するまでの手順を順番に解説します。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable2016     -> (     -> UserId int,     

  2. MySQLでENUM型のステータスから「Active」のレコードを抽出する方法

    MySQLでは、ENUM型のカラムに格納された特定の値(例:「Active」)を持つレコードを簡単に抽出できます。この記事では、ENUM型でステータスを管理するテーブルを作成し、「Active」ステータスのレコードだけを取得する具体的な手順を解説します。 1. ENUM型を使ったテーブルの作成 まず、ステータスをENUM型として定義したテーブルを作成します。ENUM型は、あらかじめ指定した文字列のリストの中から1つの値のみを格納できる便利なデータ型です。 mysql> create table DemoTable2037     -> ( &