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.