Загрузка данных


-- 1.1. Общее количество клиентов
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)) AS avg_duration FROM sessions;

-- 1.5. Общая сумма за все тренировки
SELECT SUM(price) AS total_revenue FROM sessions;
-- 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 trainers t
JOIN sessions s ON t.id = s.trainer_id
GROUP BY t.id, t.name;

-- 2.3. Общее количество минут на тренера (сортировка по убыванию)
SELECT t.name, SUM(s.duration_minutes) AS total_minutes
FROM trainers t
JOIN sessions s ON t.id = s.trainer_id
GROUP BY t.id, t.name
ORDER BY total_minutes DESC;

-- 2.4. Средний возраст клиентов по полу (в годах, без дробной части)
SELECT 
    gender,
    FLOOR(AVG(DATEDIFF(CURDATE(), birth_date) / 365.25)) AS avg_age
FROM clients
GROUP BY gender;
-- 3.1. Количество тренировок: специализация тренера — пол клиента
SELECT 
    t.specialization,
    c.gender,
    COUNT(*) AS sessions_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_amount
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_amount DESC;
-- 4.1. Тренеры со средней стоимостью тренировки > 1600
SELECT t.name, AVG(s.price) AS avg_price
FROM trainers t
JOIN sessions s ON t.id = s.trainer_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 sessions_count
FROM clients c
JOIN sessions s ON c.id = s.client_id
GROUP BY c.id, c.name
HAVING COUNT(*) > 2;

-- 4.4. Типы абонементов со средним возрастом клиентов < 35 лет
SELECT 
    membership_type,
    FLOOR(AVG(DATEDIFF(CURDATE(), birth_date) / 365.25)) AS avg_age
FROM clients
GROUP BY membership_type
HAVING AVG(DATEDIFF(CURDATE(), birth_date) / 365.25) < 35;
-- 5.1. Март 2025: тренеры с выручкой > 4000
SELECT t.name, SUM(s.price) AS total_revenue
FROM trainers t
JOIN sessions s ON t.id = s.trainer_id
WHERE s.session_date BETWEEN '2025-03-01' AND '2025-03-31'
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 clients c
JOIN sessions s ON c.id = s.client_id
WHERE c.gender = 'Ж'
GROUP BY c.membership_type
HAVING AVG(s.duration_minutes) > 60;
-- 6.1. Сколько уникальных клиентов посетили тренировки
SELECT COUNT(DISTINCT client_id) AS unique_clients FROM sessions;

-- 6.2. Для каждого тренера: количество уникальных клиентов
SELECT t.name, COUNT(DISTINCT s.client_id) AS unique_clients
FROM trainers t
LEFT JOIN sessions s ON t.id = s.trainer_id
GROUP BY t.id, t.name;
-- 7.1. По месяцам 2025 года: количество тренировок и выручка
SELECT 
    DATE_FORMAT(session_date, '%Y-%m') AS month,
    COUNT(*) AS sessions_count,
    SUM(price) AS total_revenue
FROM sessions
WHERE YEAR(session_date) = 2025
GROUP BY DATE_FORMAT(session_date, '%Y-%m')
ORDER BY month;

-- 7.2. Средняя продолжительность тренировки по месяцам
SELECT 
    DATE_FORMAT(session_date, '%Y-%m') AS month,
    ROUND(AVG(duration_minutes)) AS avg_duration
FROM sessions
WHERE YEAR(session_date) = 2025
GROUP BY DATE_FORMAT(session_date, '%Y-%m')
ORDER BY month;
-- 8.1. Самый востребованный тренер (по количеству тренировок)
SELECT t.name, COUNT(*) AS sessions_count
FROM trainers t
JOIN sessions s ON t.id = s.trainer_id
GROUP BY t.id, t.name
ORDER BY sessions_count DESC
LIMIT 1;

-- 8.2. Клиент, потративший больше всего денег
SELECT c.name, SUM(s.price) AS total_spent
FROM clients c
JOIN sessions s ON c.id = s.client_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 trainers t
JOIN sessions s ON t.id = s.trainer_id
WHERE s.session_date BETWEEN '2025-04-01' AND '2025-04-30'
GROUP BY t.specialization
ORDER BY total_revenue DESC
LIMIT 1;