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

【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つのクエリで複数条件ごとのレコード数を効率的に集計できます。条件が固定されている場合に便利な手法なので、集計処理のパフォーマンス改善にもぜひ活用してください。

  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. 2つのテーブルに対する単一のMySQL SELECTクエリは可能ですか?

    はい、可能です。FROM句にカンマ区切りで複数のテーブル名を指定することで、単一のSELECTクエリで2つのテーブルからデータを取得できます。基本的な構文は以下の通りです。select * from yourTableName1,yourTableName2;なお、この書き方では両テーブルの全行が組み合わされた「クロス結合(直積)」の結果が返される点に注意してください。サンプルテーブルの作成まず、1つ目のテーブルを作成します。mysql> create table DemoTable1    -> (   &nb