Каждый клиент с суммой его заказов, включая клиентов без единого заказа
Таблицы customers(id, name) и orders(id, customer_id, amount). Верните каждого клиента с суммарной суммой его заказов. Клиенты, ни разу не заказавшие, должны всё равно присутствовать со значением 0, а не отбрасываться и не показывать NULL.
-- одна строка на клиента: имя + сумма заказов, 0 если заказов не было
Напишите запрос.
LEFT JOIN от customers к orders сохраняет клиентов без заказов; GROUP BY по клиенту и COALESCE(SUM(o.amount), 0) превращают NULL несопоставленных строк в 0. INNER JOIN отбросил бы всех без заказов.
- ✗Брать INNER JOIN и терять каждого клиента без заказов
- ✗Считать, что SUM по несопоставленной стороне уже даёт 0 без COALESCE
- ✗Добавлять WHERE по присоединённому столбцу и снова терять клиентов без заказов
- →Почему SUM по несопоставленной стороне возвращает NULL, а не 0?
- →Как в том же запросе показать ещё и число заказов на клиента?
LEFT JOIN keeps every customer, and COALESCE turns the NULL sum of unmatched rows into 0.
SELECT c.name,
COALESCE(SUM(o.amount), 0) AS total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.id, c.name
ORDER BY total DESC;
An INNER JOIN would drop customers with no matching order. And SUM over the NULL rows produced by the outer join returns NULL, not 0 — so COALESCE(SUM(...), 0) is what actually forces the zero for customers who never ordered.