Top.Mail.Ru
Ответы

Помогите решить пункт 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.

По дате
По рейтингу
Аватар пользователя
Ученик
1мес
Изменено
1234567891011121314151617181920212223242526
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;

Аватар пользователя
Мастер
1мес

Чтобы получить ровно 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), чтобы мы смогли идеально скорректировать связи между таблицами

Аватар пользователя
Ученик
1мес

вот подробная информация об ошибке:

в текущей попытке я получил только 94 строки как и в моих прежних попытках (я поправил запрос изменив только названия полей)

ошибка:
Ожидаемый результат

123456789101112
+-----------------------------------+-----------+---------------------+--------------------+
|           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

Вывод

123456789101112
+-----------------------------------+-----------+---------------------+--------------------+
|             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

Сообщение

1
Different number of lines: out = 94, corr = 140

ниже приложу подробную информацию о обьектах

Аватар пользователя
Профи
1мес
123456789101112
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;

Аватар пользователя
Ученик
1мес

тоже самое что и в моих попытках 544 строки вместо 140 и некорректная сортировка. в задании почему то не указано но сортировка ORDER BY total_earned_points DESC, customer_name;



Видео по теме