Сумма выручки по продавцам

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.