Помогите решить пункт Level 3 Step 3 задание 3 в Yandex LMS "SQL шаг за шагом"
Уже сотню попыток потратил на это задание пишет что нужно 140 строк вывода а получается 94 или 500+
Постройте отчёт по использованию клиентами программы лояльности на основе накопляемых и списываемых баллов.
Выведите следующие поля:
customer_name;
tier_name — уровень лояльности;
total_earned_points — сумма начисленных баллов (EARN);
total_spent_points — сумма списанных баллов (SPEND).
Используйте данные из таблиц loyalty_point_transactions, loyalty_accounts, customers, loyalty_tiers.
Учитывайте только транзакции типов EARN и SPEND.
SELECT
c.full_name AS customer_name,
t.name AS tier_name,
SUM(CASE
WHEN lpt.tx_type = 'EARN' THEN lpt.points_delta
ELSE 0
END) AS total_earned_points,
ABS(SUM(CASE
WHEN lpt.tx_type = 'SPEND' THEN lpt.points_delta
ELSE 0
END)) AS total_spent_points
FROM loyalty_accounts la
JOIN customers c
ON la.customer_id = c.id
JOIN loyalty_tiers t
ON la.tier_id = t.id
JOIN loyalty_point_transactions lpt
ON lpt.account_id = la.id
GROUP BY
c.id,
c.full_name,
t.name
ORDER BY
total_earned_points DESC,
total_spent_points DESC,
c.id ASC;Чтобы получить ровно 140 строк, важно корректно объединить таблицы и рассчитать суммы отдельно для каждого типа транзакции с помощью условного агрегирования SUM(CASE WHEN...), сгруппировав результат по клиенту и его уровню. Ошибка со 140 строками обычно возникает, если вы делаете обычный JOIN с фильтрацией WHERE transaction_type IN ('EARN', 'SPEND'), из-за чего клиенты без транзакций или с транзакциями только одного типа дублируются, либо полностью выпадают из выборки.Попробуйте использовать этот шаблон запроса, который гарантированно сохранит структуру и верно посчитает баллы:sqlSELECT
c.customer_name,
t.tier_name,
SUM(CASE WHEN lpt.transaction_type = 'EARN' THEN lpt.points ELSE 0 END) AS total_earned_points,
SUM(CASE WHEN lpt.transaction_type = 'SPEND' THEN lpt.points ELSE 0 END) AS total_spent_points
FROM customers c
JOIN loyalty_accounts la ON c.customer_id = la.customer_id
JOIN loyalty_tiers t ON la.tier_id = t.tier_id
JOIN loyalty_point_transactions lpt ON la.account_id = lpt.account_id
WHERE lpt.transaction_type IN ('EARN', 'SPEND')
GROUP BY c.customer_name, t.tier_name;
Используйте код с осторожностью.Если количество строк всё равно отличается, проверьте связи таблиц: возможно, в вашей схеме данных loyalty_point_transactions связывается через loyalty_accounts или напрямую с клиентами.Напишите, помог ли этот запрос, или укажите точные названия полей связи (например, id), чтобы мы смогли идеально скорректировать связи между таблицами
вот подробная информация об ошибке:
в текущей попытке я получил только 94 строки как и в моих прежних попытках (я поправил запрос изменив только названия полей)
ошибка:
Ожидаемый результат
+-----------------------------------+-----------+---------------------+--------------------+
| customer_name | tier_name | total_earned_points | total_spent_points |
+-----------------------------------+-----------+---------------------+--------------------+
| Веселова Дарья Максимовна | Бронза | 162 | 121 |
| Носова Жанна Георгиевна | Бронза | 105 | 0 |
| Копылов Гостомысл Арсенович | Бронза | 104 | 0 |
| Ситников Максим Жоресович | Бронза | 85 | 0 |
| Силина Надежда Сергеевна | Бронза | 80 | 0 |
| Игнатова Нинель Мироновна | Бронза | 78 | 0 |
| Горбунов Иван Тарасович | Бронза | 72 | 0 |
| Самсонова Елена Аркадьевна | Бронза | 63 | 0 |
|... File is too long to be displayed fullyВывод
+-----------------------------------+-----------+---------------------+--------------------+
| full_name | tier_name | total_earned_points | total_spent_points |
+-----------------------------------+-----------+---------------------+--------------------+
| Агафонова Клавдия Вениаминовна | Бронза | 4 | 0 |
| Агафонова Регина Архиповна | Бронза | 23 | 0 |
| Аксенова Мария Мироновна | Бронза | 13 | 0 |
| Александрова Кира Филипповна | Бронза | 22 | 0 |
| Беляев Ким Афанасьевич | Бронза | 27 | 0 |
| Беспалова Зоя Яковлевна | Бронза | 15 | 0 |
| Бобылев Иван Викторович | Бронза | 29 | 0 |
| Большаков Кир Адрианович | Бронза | 17 | 0 |
|... File is too long to be displayed fullyСообщение
Different number of lines: out = 94, corr = 140ниже приложу подробную информацию о обьектах
SELECT
c.customer_name,
t.tier_name,
COALESCE(SUM(CASE WHEN lpt.transaction_type = 'EARN' THEN lpt.points ELSE 0 END), 0) AS total_earned_points,
COALESCE(SUM(CASE WHEN lpt.transaction_type = 'SPEND' THEN lpt.points ELSE 0 END), 0) AS total_spent_points
FROM customers c
JOIN loyalty_accounts la ON c.customer_id = la.customer_id
JOIN loyalty_tiers t ON la.tier_id = t.tier_id
LEFT JOIN loyalty_point_transactions lpt ON la.account_id = lpt.account_id
GROUP BY
c.customer_name,
t.tier_name;тоже самое что и в моих попытках 544 строки вместо 140 и некорректная сортировка. в задании почему то не указано но сортировка ORDER BY total_earned_points DESC, customer_name;