COUNTとGROUP BYを同時に使用する方法の他の方法
SQLでCOUNT関数とGROUP BY句を組み合わせることで、特定の列に基づいてデータを集計し、各グループのレコード数をカウントすることができます。
例題
以下の従業員テーブルがあるとします。
| id | department |
|---|---|
| 1 | 営業部 |
| 2 | 営業部 |
| 3 | 経理部 |
| 4 | 経理部 |
| 5 | 企画部 |
各部署の従業員数を取得したい場合
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
このクエリは、以下の結果を返します。
| department | employee_count |
|---|---|
| 営業部 | 2 |
| 経理部 | 2 |
| 企画部 | 1 |
解説
SELECT department, COUNT(*) AS employee_count
:department
: グループ化する列COUNT(*)
: 各グループのレコード数をカウントAS employee_count
: 結果のカラム名をエイリアスで指定
FROM employees
: データを取得するテーブルGROUP BY department
:department
列に基づいてデータを集計
- 各部署の男性従業員数を取得
SELECT department, COUNT(*) AS male_employee_count
FROM employees
WHERE gender = '男性'
GROUP BY department;
- 各部署の平均給与を取得
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;
COUNT関数とGROUP BY句を組み合わせることで、様々な集計を行うことができます。
SELECT department,
COUNT(*) AS employee_count,
AVG(salary) AS average_salary
FROM employees
GROUP BY department;
結果
| department | employee_count | average_salary |
|---|---|---|
| 営業部 | 2 | 400000 |
| 経理部 | 2 | 350000 |
| 企画部 | 1 | 500000 |
SELECT department,
COUNT(*) AS male_employee_count,
AVG(salary) AS average_salary
FROM employees
WHERE gender = '男性'
GROUP BY department;
| department | male_employee_count | average_salary |
|---|---|---|
| 営業部 | 1 | 450000 |
| 経理部 | 1 | 300000 |
| 企画部 | 0 | NULL |
SELECT department,
CASE
WHEN age BETWEEN 20 AND 29 THEN '20代'
WHEN age BETWEEN 30 AND 39 THEN '30代'
WHEN age BETWEEN 40 AND 49 THEN '40代'
ELSE '50代以上'
END AS age_group,
COUNT(*) AS employee_count
FROM employees
GROUP BY department, age_group;
| department | age_group | employee_count |
|---|---|---|
| 営業部 | 20代 | 1 |
| 営業部 | 30代 | 1 |
| 経理部 | 30代 | 1 |
| 経理部 | 40代 | 1 |
| 企画部 | 50代以上 | 1 |
COUNTとGROUP BYを同時に使用する方法の他の方法
SELECT department,
(SELECT COUNT(*) FROM employees AS e WHERE e.department = d.department) AS employee_count
FROM employees AS d
GROUP BY department;
ウィンドウ関数を使用する
SELECT department,
COUNT(*) OVER (PARTITION BY department) AS employee_count
FROM employees;
これらの方法は、上記の例と同じ結果を返します。
方法の比較
方法 | メリット | デメリット |
---|---|---|
GROUP BY | シンプルで分かりやすい | 複雑な集計には不向き |
サブクエリ | 複雑な集計に適している | 冗長になりやすい |
ウィンドウ関数 | 簡潔で効率的 | サブクエリよりも複雑 |
sql count group-by