SQLのGROUP BYと集約関数を完全ガイド!初心者でもわかるデータの集計方法
新人
「SQLでデータを集計する方法を知りたいです!」
先輩
「それなら、GROUP BYと集約関数を使うと便利だよ。」
新人
「GROUP BYと集約関数って何ですか?」
先輩
「データを集計するときに使う関数のことだよ。たとえば、データの個数を数えたり、合計を求めたり、平均を計算したりするのに使うんだ。」
1. 集約関数とは?
SQLの集約関数とは、複数のデータを1つの値にまとめて計算する関数です。
主な集約関数
- COUNT: データの件数を数える
- SUM: 数値データの合計を求める
- AVG: 数値データの平均を求める
- MIN: 最小値を求める
- MAX: 最大値を求める
今回は、基本となるCOUNT、SUM、AVGの使い方を解説します。
2. COUNT, SUM, AVGの基本的な使い方
集約関数を使うことで、データの統計情報を簡単に取得できます。
1. COUNT関数(データの件数を数える)
COUNTを使うと、特定のデータが何件あるのかを調べることができます。
SELECT COUNT(*) AS employee_count FROM employee;
このSQLを実行すると、従業員の総数が取得できます。
| employee_count |
|---|
| 5 |
2. SUM関数(数値の合計を求める)
SUMを使うと、指定したカラムの合計値を求めることができます。
SELECT SUM(salary) AS total_salary FROM employee;
このSQLを実行すると、全社員の給与の合計が取得できます。
| total_salary |
|---|
| 25500000 |
3. AVG関数(数値の平均を求める)
AVGを使うと、数値データの平均値を計算できます。
SELECT AVG(salary) AS average_salary FROM employee;
このSQLを実行すると、全社員の平均給与が取得できます。
| average_salary |
|---|
| 5100000 |
このように、集約関数を使うと、データの統計情報を簡単に取得できます。
4. GROUP BYの基本(データをグループ化する方法)
SQLのGROUP BYを使うと、特定のカラムの値ごとにデータをグループ化し、集計を行うことができます。
1. GROUP BYを使った基本的な集計
例えば、部署ごとの従業員数を求める場合、GROUP BYを使用してデータをdepartmentごとに集計します。
SELECT department, COUNT(*) AS employee_count
FROM employee
GROUP BY department;
このSQLを実行すると、各部署に所属する従業員の人数が取得できます。
| department | employee_count |
|---|---|
| 営業 | 2 |
| 開発 | 2 |
| 人事 | 1 |
このように、GROUP BYを使うことで、同じ部署ごとにデータをグループ化し、集計が可能になります。
5. MIN, MAX関数を使って最小値・最大値を取得する
MIN関数とMAX関数を使うと、それぞれ最小値・最大値を求めることができます。
1. MIN関数を使って最小値を取得
例えば、全社員の中で最も低い給与を取得したい場合、以下のSQLを使用します。
SELECT MIN(salary) AS lowest_salary FROM employee;
このSQLを実行すると、最も低い給与が取得できます。
| lowest_salary |
|---|
| 4200000 |
2. MAX関数を使って最大値を取得
逆に、最も高い給与を取得したい場合は、MAX関数を使用します。
SELECT MAX(salary) AS highest_salary FROM employee;
このSQLを実行すると、最も高い給与が取得できます。
| highest_salary |
|---|
| 6000000 |
このように、MINやMAXを使うことで、データの最小値や最大値を簡単に取得できます。
6. GROUP BYとSUM, AVGを組み合わせた集計
複数のデータをグループ化して集計する場合、GROUP BYとSUMやAVGを組み合わせて使用します。
1. 各部署の給与合計を求める(SUM関数)
各部署ごとの給与の合計を求めるには、SUM関数を使います。
SELECT department, SUM(salary) AS total_salary
FROM employee
GROUP BY department;
このSQLを実行すると、各部署の給与の合計が取得できます。
| department | total_salary |
|---|---|
| 営業 | 9800000 |
| 開発 | 12000000 |
| 人事 | 4800000 |
2. 各部署の給与平均を求める(AVG関数)
各部署ごとの給与の平均を求めるには、AVG関数を使います。
SELECT department, AVG(salary) AS average_salary
FROM employee
GROUP BY department;
このSQLを実行すると、各部署の給与の平均が取得できます。
| department | average_salary |
|---|---|
| 営業 | 4900000 |
| 開発 | 6000000 |
| 人事 | 4800000 |
このように、GROUP BYと集約関数を組み合わせることで、グループごとの合計や平均を取得できます。
7. HAVING句を使った条件付き集計
HAVING句を使うと、GROUP BYでグループ化した後の集計結果に対して条件を指定できます。
1. 各部署の平均給与が500万円以上の部署を取得
例えば、各部署の平均給与が500万円以上の部署を取得したい場合、以下のSQLを使用します。
SELECT department, AVG(salary) AS average_salary
FROM employee
GROUP BY department
HAVING AVG(salary) >= 5000000;
このSQLを実行すると、平均給与が500万円以上の部署のみが取得されます。
| department | average_salary |
|---|---|
| 開発 | 6000000 |
| 営業 | 4900000 |
2. HAVING句とWHERE句の違い
HAVING句は、GROUP BYの結果に条件を適用します。一方、WHERE句は、GROUP BYの前に適用されます。
-- WHEREを使用(個々のデータに適用)
SELECT department, AVG(salary) AS average_salary
FROM employee
WHERE salary >= 5000000
GROUP BY department;
この場合は、500万円以上の給与データのみを集計対象にし、その後で部署ごとの平均給与を求めます。
8. GROUP BYとORDER BYの組み合わせ方
GROUP BYで集計した結果を並び替えたい場合、ORDER BYを組み合わせます。
1. 部署ごとの平均給与を高い順に並び替える
例えば、各部署の平均給与を高い順に表示するには、以下のように記述します。
SELECT department, AVG(salary) AS average_salary
FROM employee
GROUP BY department
ORDER BY average_salary DESC;
このSQLを実行すると、平均給与が高い順に部署が表示されます。
| department | average_salary |
|---|---|
| 開発 | 6000000 |
| 営業 | 4900000 |
| 人事 | 4800000 |
2. 従業員数が多い順に部署を並べる
SELECT department, COUNT(*) AS employee_count
FROM employee
GROUP BY department
ORDER BY employee_count DESC;
このSQLを実行すると、従業員の多い部署順に表示されます。
9. 実践!GROUP BYを使ったデータ分析
GROUP BYを使うことで、ビジネスデータの分析が可能になります。
1. 各部署の最大給与と最小給与を取得
SELECT department, MAX(salary) AS max_salary, MIN(salary) AS min_salary
FROM employee
GROUP BY department;
このSQLを実行すると、各部署の最高給与と最低給与が取得できます。
| department | max_salary | min_salary |
|---|---|---|
| 開発 | 6000000 | 5000000 |
| 営業 | 5000000 | 4800000 |
| 人事 | 4800000 | 4800000 |
2. 1ヶ月の売上合計を求める
売上管理テーブルsalesがあるとします。
SELECT DATE_FORMAT(sale_date, '%Y-%m') AS month, SUM(amount) AS total_sales
FROM sales
GROUP BY month
ORDER BY month DESC;
このSQLを実行すると、月ごとの売上合計が取得できます。
| month | total_sales |
|---|---|
| 2024-06 | 15000000 |
| 2024-05 | 12000000 |
このように、GROUP BYを活用すると、さまざまなデータ分析が可能になります。