Загрузка данных
1 задание
-- 1.1. Общее количество клиентов в таблице clients
SELECT COUNT(*) AS total_clients FROM clients;
-- 1.2. Самый опытный тренер (максимальное количество лет опыта)
SELECT MAX(experience_years) AS max_experience FROM trainers;
-- 1.3. Наименьшая зарплата среди тренеров
SELECT MIN(salary) AS min_salary FROM trainers;
-- 1.4. Средняя продолжительность тренировки в минутах, округлить до целого
SELECT ROUND(AVG(duration_minutes), 0) AS avg_duration FROM sessions;
-- 1.5. Общая сумма, которую заплатили клиенты за все тренировки
SELECT SUM(price) AS total_revenue FROM sessions;
2 задание
-- 2.1. Количество клиентов по типам абонементов
SELECT membership_type, COUNT(*) AS client_count
FROM clients
GROUP BY membership_type;
-- 2.2. Для каждого тренера: минимальная и максимальная стоимость его тренировки
SELECT t.name, MIN(s.price) AS min_price, MAX(s.price) AS max_price
FROM sessions s
JOIN trainers t ON s.trainer_id = t.id
GROUP BY t.id, t.name;
-- 2.3. Общее количество минут, которое провёл с клиентами каждый тренер (сумма минут), сортировка по убыванию
SELECT t.name, SUM(s.duration_minutes) AS total_minutes
FROM sessions s
JOIN trainers t ON s.trainer_id = t.id
GROUP BY t.id, t.name
ORDER BY total_minutes DESC;
-- 2.4. Средний возраст клиентов для каждого пола (без дробной части)
-- Возраст вычисляется как разница в годах от registration_date (по аналогии с примером про publication_year)
SELECT gender, FLOOR(AVG(YEAR(registration_date) - YEAR(birth_date))) AS avg_age
FROM clients
GROUP BY gender;
3 задание
-- 3.1. Количество тренировок в разрезе "специализация тренера — пол клиента"
SELECT t.specialization, c.gender, COUNT(*) AS session_count
FROM sessions s
JOIN trainers t ON s.trainer_id = t.id
JOIN clients c ON s.client_id = c.id
GROUP BY t.specialization, c.gender
ORDER BY t.specialization, c.gender;
-- 3.2. Для каждого тренера и типа абонемента: суммарная стоимость проведённых тренировок
SELECT t.name, c.membership_type, SUM(s.price) AS total_sum
FROM sessions s
JOIN trainers t ON s.trainer_id = t.id
JOIN clients c ON s.client_id = c.id
GROUP BY t.id, t.name, c.membership_type
ORDER BY t.name, total_sum DESC;
4 задание
-- 4.1. Тренеры, у которых средняя стоимость тренировки > 1600 рублей
SELECT t.name, AVG(s.price) AS avg_price
FROM sessions s
JOIN trainers t ON s.trainer_id = t.id
GROUP BY t.id, t.name
HAVING AVG(s.price) > 1600;
-- 4.2. Специализации, по которым работает более одного тренера
SELECT specialization, COUNT(*) AS trainer_count
FROM trainers
GROUP BY specialization
HAVING COUNT(*) > 1;
-- 4.3. Клиенты, которые посетили более 2 тренировок
SELECT c.name, COUNT(*) AS session_count
FROM sessions s
JOIN clients c ON s.client_id = c.id
GROUP BY c.id, c.name
HAVING COUNT(*) > 2;
-- 4.4. Типы абонементов, у которых средний возраст клиентов < 35 лет
SELECT c.membership_type, FLOOR(AVG(YEAR(c.registration_date) - YEAR(c.birth_date))) AS avg_age
FROM clients c
GROUP BY c.membership_type
HAVING AVG(YEAR(c.registration_date) - YEAR(c.birth_date)) < 35;
5 задание
-- 5.1. Среди тренировок марта 2025: тренеры с суммарной выручкой > 4000
SELECT t.name, SUM(s.price) AS total_revenue
FROM sessions s
JOIN trainers t ON s.trainer_id = t.id
WHERE s.session_date >= '2025-03-01' AND s.session_date < '2025-04-01'
GROUP BY t.id, t.name
HAVING SUM(s.price) > 4000;
-- 5.2. Среди клиентов женского пола: типы абонементов со средней длительностью > 60 минут
SELECT c.membership_type, AVG(s.duration_minutes) AS avg_duration
FROM sessions s
JOIN clients c ON s.client_id = c.id
WHERE c.gender = 'Ж'
GROUP BY c.membership_type
HAVING AVG(s.duration_minutes) > 60;
6 задание
-- 6.1. Сколько уникальных клиентов посетили тренировки (таблица sessions)
SELECT COUNT(DISTINCT client_id) AS unique_clients FROM sessions;
-- 6.2. Для каждого тренера: сколько разных клиентов он тренировал
SELECT t.name, COUNT(DISTINCT s.client_id) AS unique_clients
FROM sessions s
JOIN trainers t ON s.trainer_id = t.id
GROUP BY t.id, t.name
ORDER BY unique_clients DESC;
7 задание
-- 7.1. Количество тренировок и общая сумма выручки для каждого месяца 2025 года
SELECT
DATE_FORMAT(s.session_date, '%Y-%m') AS month,
COUNT(*) AS session_count,
SUM(s.price) AS total_revenue
FROM sessions s
WHERE YEAR(s.session_date) = 2025
GROUP BY DATE_FORMAT(s.session_date, '%Y-%m')
ORDER BY month;
-- 7.2. Для каждого месяца: средняя продолжительность тренировки (округлить до целого)
SELECT
DATE_FORMAT(s.session_date, '%Y-%m') AS month,
ROUND(AVG(s.duration_minutes), 0) AS avg_duration
FROM sessions s
WHERE YEAR(s.session_date) = 2025
GROUP BY DATE_FORMAT(s.session_date, '%Y-%m')
ORDER BY month;
8 задание
-- 8.1. Самый востребованный тренер по количеству проведённых тренировок
SELECT t.name, COUNT(*) AS session_count
FROM sessions s
JOIN trainers t ON s.trainer_id = t.id
GROUP BY t.id, t.name
ORDER BY session_count DESC
LIMIT 1;
-- 8.2. Клиент, который потратил больше всего денег на тренировки
SELECT c.name, SUM(s.price) AS total_spent
FROM sessions s
JOIN clients c ON s.client_id = c.id
GROUP BY c.id, c.name
ORDER BY total_spent DESC
LIMIT 1;
-- 8.3. Тренировки по какой специализации принесли наибольшую выручку в апреле 2025 года
SELECT t.specialization, SUM(s.price) AS total_revenue
FROM sessions s
JOIN trainers t ON s.trainer_id = t.id
WHERE s.session_date >= '2025-04-01' AND s.session_date < '2025-05-01'
GROUP BY t.specialization
ORDER BY total_revenue DESC
LIMIT 1;