【MySQL入門】1つのクエリで複数の条件別レコード数を取得する方法(CASE式とSUMの活用)
MySQLでは、CASE式とSUM()関数を組み合わせることで、1つのクエリだけで複数の条件に一致するレコード数を同時に取得できます。この記事では、従業員の性別(Male/Female)を格納したカラムを例に、男性従業員数と女性従業員数を1回のクエリで集計する手順を解説します。
サンプルテーブルの作成
まず、性別を格納するためのENUM型カラムを持つテーブルを作成します。
mysql> create table DemoTable
(
EmployeeGender ENUM('Male','Female')
);
Query OK, 0 rows affected (0.52 sec)
テストデータの挿入
INSERT文を使って、サンプルとなるレコードをいくつか登録します。
mysql> insert into DemoTable values('Male');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('Female');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Male');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('Female');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values('Male');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable values('Female');
Query OK, 1 row affected (0.08 sec)
登録データの確認
SELECT文ですべてのレコードを表示し、正しく登録されているか確認しましょう。
mysql> select *from DemoTable;
実行結果は次のとおりです。合計6件のレコードが登録されています。
+----------------+ | EmployeeGender | +----------------+ | Male | | Female | | Male | | Female | | Male | | Female | +----------------+ 6 rows in set (0.00 sec)
1つのクエリで複数のカウントを取得するSQL
ポイントは、CASE式で条件に一致すれば「1」、一致しなければ「0」を返し、その結果をSUM()で合計することです。これにより、男性と女性それぞれの件数を1回のクエリで取得できます。
mysql> select sum(case when EmployeeGender='Male' then 1 else 0 end) as Total_Number_Of_Male_Employee, sum(case when EmployeeGender='Female' then 1 else 0 end) as Total_Number_Of_Female_Employee from DemoTable;
実行結果:
+-------------------------------+---------------------------------+ | Total_Number_Of_Male_Employee | Total_Number_Of_Female_Employee | +-------------------------------+---------------------------------+ | 3 | 3 | +-------------------------------+---------------------------------+ 1 row in set (0.00 sec)
補足:COUNT()を使った代替方法
SUM()の代わりにCOUNT()でも同じ結果が得られます。CASE式で条件に一致した場合のみ値を返し、NULLとなった行はCOUNTされない仕組みを利用します。
select count(case when EmployeeGender='Male' then 1 end) as Total_Number_Of_Male_Employee, count(case when EmployeeGender='Female' then 1 end) as Total_Number_Of_Female_Employee from DemoTable;
また、カテゴリが多数ある場合は、GROUP BYを使うほうがシンプルにまとまります。
select EmployeeGender, count(*) as Total from DemoTable group by EmployeeGender;
まとめ
CASE式とSUM()を組み合わせれば、1つのクエリで複数条件ごとのレコード数を効率的に集計できます。条件が固定されている場合に便利な手法なので、集計処理のパフォーマンス改善にもぜひ活用してください。
-
【MySQL】UNION ALLを使って複数テーブルのCOUNT合計を1つのクエリで取得する方法
はじめにMySQLでは、複数のテーブルに保存されたデータの件数(COUNT)をまとめて集計したいケースがあります。そんなときに便利なのがUNION ALLです。UNION ALLを使えば、複数のSELECT文の結果を1つに結合し、その合計値を単一のクエリで取得できます。本記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。1つ目のテーブルを作成するまず、以下のCREATE TABLE文で最初のテーブル「DemoTable1」を作成します。mysql> create table DemoTable1-> (-> Id int,-> Name v
-
2つのテーブルに対する単一のMySQL SELECTクエリは可能ですか?
はい、可能です。FROM句にカンマ区切りで複数のテーブル名を指定することで、単一のSELECTクエリで2つのテーブルからデータを取得できます。基本的な構文は以下の通りです。select * from yourTableName1,yourTableName2;なお、この書き方では両テーブルの全行が組み合わされた「クロス結合(直積)」の結果が返される点に注意してください。サンプルテーブルの作成まず、1つ目のテーブルを作成します。mysql> create table DemoTable1 -> ( &nb