GROUP BY句とHAVING句

GROUP BY句とHAVING句#

employeesテーブルが次のように定義されているとします。

CREATE TABLE employees (
    id TEXT PRIMARY KEY,
    name TEXT,
    department TEXT,
    age INTEGER,
    salary INTEGER
);
INSERT INTO employees (id, name, department, age, salary) VALUES
('1', 'Alice', 'HR', 30, 600),
('2', 'Bob', 'Engineering', 25, 700),
('3', 'Charlie', 'HR', 35, 800),
('4', 'David', 'Engineering', 28, 900);

各部門ごとの平均給与を求める場合は,繰り返してWHERE句を使用して各部門の平均給与を計算することができます.

SELECT AVG(salary) AS HR_Average_Salary
FROM employees
WHERE department = 'HR';

SELECT AVG(salary) AS Engineering_Average_Salary
FROM employees
WHERE department = 'Engineering';

GROUP BY句#

GROUP BY句は,指定した基準に基づいてデータをグループ化し、集約関数を使用して各グループの統計情報を取得することができます.

構文#

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name;

使用例#

それぞれの部門ごとの平均給与を求めるには、次のようにGROUP BY句を使用します。

SELECT department, AVG(salary) AS Average_Salary
FROM employees
GROUP BY department;

このクエリは、employeesテーブルから各部門ごとの平均給与を計算します.結果は次のようになります:

| department  | Average_Salary |
| ----------- | -------------- |
| HR          | 700            |
| Engineering | 800            |

HAVING句#

HAVING句は、GROUP BY句でグループ化された結果に対して条件を指定するために使用されます.

HAVING句とWHERE句と似ていますが、WHERE句はグループ化前の行に対して条件を適用し、HAVING句はグループ化後の結果に対して条件を適用します.

構文#

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name
HAVING aggregate_function(column_name) condition;

使用例#

例えば、各部門の平均給与が750以上の部門のみを取得するには、次のようにHAVING句を使用します。

SELECT department, AVG(salary) AS Average_Salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 750;

このクエリは、各部門の平均給与が750以上の部門のみを返します.結果は次のようになります:

| department  | Average_Salary |
| ----------- | -------------- |
| Engineering | 800            |

練習#

Chinookデータベースを使用して,下記のクエリを作成せよ.

  1. tracksテーブルから各アルバムごとのトラック数を求めるクエリを作成せよ.

  2. albumsテーブルから各アーティストごとのアルバム数を求めるクエリを作成せよ.

  3. tracksテーブルから各ジャンルごとのトラック数を求めるクエリを作成せよ.ただし,トラック数が10以上のジャンルのみを対象とする.

  4. customersテーブルから各国ごとの顧客数を求めるクエリを作成せよ.ただし,顧客数が5人以上の国のみを対象とする.

解答#

-- 1. 
SELECT AlbumId, COUNT(TrackId) AS TrackCount
FROM tracks
GROUP BY AlbumId;

-- 2.
SELECT ArtistId, COUNT(AlbumId) AS AlbumCount
FROM albums
GROUP BY ArtistId;

-- 3.
SELECT GenreId, COUNT(TrackId) AS TrackCount
FROM tracks
GROUP BY GenreId
HAVING COUNT(TrackId) >= 10;

-- 4.
SELECT Country, COUNT(CustomerId) AS CustomerCount
FROM customers
GROUP BY Country
HAVING COUNT(CustomerId) >= 5;