Получить среднюю сумму транзакций по счетам клиентов

72. Получить среднюю сумму транзакций по счетам клиентов

Условие задачи:
Даны таблицы Customer, Account и Fin_Transaction.

Необходимо вывести:

  • имя клиента;

  • описание его лицевого счёта;

  • среднюю сумму транзакций по этому счёту.

При этом:

  • у клиента может не быть ни одного счёта;

  • у счёта может не быть ни одной транзакции.

Код:

Customer
-----------------
Id
Name
Address

Account
-----------------
Id
Acc_Number
Description
Customer_Id

Fin_Transaction
-----------------
Id
TransactDate
Amount
Account_Id
Description

Связи между таблицами:

Account.Customer_Id → Customer.Id
Fin_Transaction.Account_Id → Account.Id

Спойлеры к решению

Подсказки
💡 Начинай запрос с таблицы Customer, чтобы сохранить всех клиентов.
💡 Используй LEFT JOIN с Account, чтобы не потерять клиентов без счетов.
💡 Соединение с Fin_Transaction также должно быть через LEFT JOIN, чтобы сохранить счета без транзакций.
💡 Среднюю сумму вычисли через AVG().
💡 Группируй также по идентификаторам клиента и счёта, чтобы записи с одинаковыми именами или описаниями не объединялись.

Решение
SELECT
    c.Name AS customer_name,
    a.Description AS account_description,
    AVG(ft.Amount) AS average_transaction_amount
FROM Customer c
LEFT JOIN Account a
    ON a.Customer_Id = c.Id
LEFT JOIN Fin_Transaction ft
    ON ft.Account_Id = a.Id
GROUP BY
    c.Id,
    c.Name,
    a.Id,
    a.Description;

Первый LEFT JOIN:

LEFT JOIN Account a
    ON a.Customer_Id = c.Id

сохраняет в результате клиента, даже если у него нет ни одного счёта.

Второй LEFT JOIN:

LEFT JOIN Fin_Transaction ft
    ON ft.Account_Id = a.Id

сохраняет счёт, даже если по нему ещё не было транзакций.

Средняя сумма рассчитывается через:

AVG(ft.Amount)

Если у счёта нет транзакций, AVG() вернёт NULL.

Группировка выполняется отдельно для каждого клиента и каждого счёта:

GROUP BY
    c.Id,
    c.Name,
    a.Id,
    a.Description

Это не позволяет объединить разных клиентов с одинаковыми именами или разные счета с одинаковыми описаниями.

Для клиента без счетов в результате будет одна строка, где account_description и average_transaction_amount равны NULL.