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 BYとSUM()を組み合わせれば、CASE文を明示的に書かなくても、ブール式の合計によって値ごとの件数を効率的に集計できます。より可読性を重視したい場合は、SUM(CASE WHEN isMarried='Yes' THEN 1 ELSE 0 END)のようにCASE式を使った書き方もおすすめです。この手法は、「承認/却下」「有効/無効」など、二値のステータスを持つデータの統計処理全般に応用できます。
-
MySQLで同じIDを持つレコードを特殊文字区切りで1行に連結するクエリ(CONCAT_WS+GROUP_CONCAT)
同じIDを持つ複数のレコードを、特殊文字で区切りながら1行にまとめて連結したい場合には、CONCAT_WS()とGROUP_CONCAT()を組み合わせて使用するのが効果的です。この記事では、実際にテーブルを作成し、レコードを連結するまでの手順を順番に解説します。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable2016 -> ( -> UserId int,
-
MySQLでENUM型のステータスから「Active」のレコードを抽出する方法
MySQLでは、ENUM型のカラムに格納された特定の値(例:「Active」)を持つレコードを簡単に抽出できます。この記事では、ENUM型でステータスを管理するテーブルを作成し、「Active」ステータスのレコードだけを取得する具体的な手順を解説します。 1. ENUM型を使ったテーブルの作成 まず、ステータスをENUM型として定義したテーブルを作成します。ENUM型は、あらかじめ指定した文字列のリストの中から1つの値のみを格納できる便利なデータ型です。 mysql> create table DemoTable2037 -> ( &