MySQLでGROUP BYした結果をCOUNTする方法

MySQLでGROUP BYした結果をCOUNTする方法

GROUP BYは、特定の列に基づいて結果セットをグループ化し、COUNTはこれらのグループ内のレコード数をカウントするのに使用されます。
これにより、特定の値ごとにいくつの行が存在するかを簡単に確認できます。

たとえば、次のようなデータを持つemployeesというテーブルがあるとします。

id department name
---- ------------ ------------
1 HR Alice
2 IT Bob
3 HR Charlie
4 IT David
5 IT Eve

このテーブルから、department(部門)ごとに従業員の数をカウントしたい場合、GROUP BYとCOUNTを組み合わせたクエリを使用します。

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
  • SELECT department, COUNT(*) AS employee_count:department列の値ごとにグループ化し、そのグループ内の行数をカウントします。

COUNT(*)はグループ内の全ての行をカウントします。
AS employee_countは、このカウントの結果に名前を付けている部分で、結果セットにおいてこのカウントを表す列名がemployee_countになります。

  • FROM employees:employeesテーブルからデータを取得します。
  • GROUP BY department:department列の値ごとに結果セットをグループ化します。

これにより、HRやITのような各部門ごとに1行ずつ結果が得られます。

このクエリを実行すると、以下のような結果が得られます。

department employee_count
------------ ----------------
HR 2
IT 3

この結果は、HR部門には2人、IT部門には3人の従業員がいることを示しています。

条件付きカウント

条件付きでグループ化された結果をカウントしたい場合は、CASE文やSUM関数を組み合わせることができます。
たとえば、特定の条件に一致する行だけをカウントする場合、次のようなクエリを使用します。

SELECT department,
       SUM(CASE WHEN name LIKE 'A%' THEN 1 ELSE 0 END) AS count_a_names
FROM employees
GROUP BY department;

このクエリは、departmentごとに名前が'A'で始まる従業員の数をカウントします。
CASE文は、nameが'A%'(つまり'A'で始まる)場合に1を返し、それ以外の場合には0を返します。
SUM関数は、この結果を合計して、該当する条件を満たす行の数を求めます。

複数のカウント

複数の条件に基づいてカウントを行いたい場合は、次のように複数のCOUNTまたはSUMを使用できます。

SELECT department,
       COUNT(*) AS total_employees,
       SUM(CASE WHEN name LIKE 'A%' THEN 1 ELSE 0 END) AS count_a_names,
       SUM(CASE WHEN name LIKE 'D%' THEN 1 ELSE 0 END) AS count_d_names
FROM employees
GROUP BY department;

このクエリは、各部門ごとに総従業員数、名前が'A'で始まる従業員数、'D'で始まる従業員数をそれぞれカウントします。
結果として、複数の条件を一度に評価することができます。

グループ化された結果をさらにフィルタリング

GROUP BYでグループ化された結果をさらに絞り込みたい場合は、HAVING句を使用します。
HAVING句は、GROUP BYで生成された各グループに対して条件を設定するために使用されます。

例えば、従業員数が2人以上の部門だけを表示するには、次のようにします。

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) >= 2;

このクエリでは、HAVING句によって、COUNT(*)が2以上のグループだけが結果として返されます。
結果として、従業員が1人以下の部門は除外されます。

MySQLのGROUP BYとCOUNTの組み合わせは、データ分析をする際に使用することが多いです。
特定の条件に基づいてカウントを行いたい場合や、複数のカウント条件を組み合わせたい場合に柔軟に対応できます。