47. Посчитать выручку каждого продавца
Условие задачи:
Даны таблицы Salespersons, Customers и Orders.
Необходимо вывести:
идентификатор каждого продавца;
общую сумму заказов его клиентов.
В результате должны присутствовать все продавцы, включая тех, у кого нет заказов. Для таких продавцов сумма должна быть равна 0.
Результат нужно отсортировать по id продавца.
Код:
CREATE TABLE Salespersons (
id SERIAL PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE Customers (
id SERIAL PRIMARY KEY,
salesperson_id INT
);
CREATE TABLE Orders (
id SERIAL PRIMARY KEY,
customer_id INT,
price INT
);
Спойлеры к решению
Подсказки
💡 Начинай выборку с таблицы
💡 Соедини продавцов с клиентами, а клиентов — с заказами через
💡 Для подсчёта выручки используй
💡 Для продавцов без заказов
💡 Группируй результат по продавцу и отсортируй по его
Salespersons, чтобы сохранить всех продавцов.💡 Соедини продавцов с клиентами, а клиентов — с заказами через
LEFT JOIN.💡 Для подсчёта выручки используй
SUM(o.price).💡 Для продавцов без заказов
SUM() вернёт NULL, поэтому используй COALESCE().💡 Группируй результат по продавцу и отсортируй по его
id.Решение
SELECT
s.id AS salesperson_id,
COALESCE(SUM(o.price), 0) AS total_earned
FROM Salespersons s
LEFT JOIN Customers c
ON c.salesperson_id = s.id
LEFT JOIN Orders o
ON o.customer_id = c.id
GROUP BY s.id
ORDER BY s.id;
Первый LEFT JOIN сохраняет продавцов, у которых нет клиентов:
LEFT JOIN Customers c
ON c.salesperson_id = s.id
Второй LEFT JOIN сохраняет клиентов, у которых нет заказов:
LEFT JOIN Orders o
ON o.customer_id = c.id
После этого SUM(o.price) подсчитывает общую стоимость всех заказов клиентов конкретного продавца.
Для продавца без заказов результат SUM() будет равен NULL, поэтому:
COALESCE(SUM(o.price), 0)
заменяет его на 0.