Вступить в клуб →
лёгкаявопросSQL и витрины данных

LEFT JOIN, из которого пропали пользователи без заказов

Нужен список всех пользователей с числом заказов за 2026 год, включая тех, у кого заказов не было. Написали так:

SELECT u.user_id, COUNT(o.order_id) AS orders
FROM users u
LEFT JOIN orders o ON o.user_id = u.user_id
WHERE o.created_at >= '2026-01-01'
GROUP BY u.user_id;

В результате пользователи без заказов отсутствуют. Почему и как исправить?

  • COUNT(o.order_id) пропускает пустые группы — нужно заменить его на COUNT(*)
  • Для пользователей без заказов нужен отдельный запрос и UNION: LEFT JOIN не сохраняет строки без пары, если в запросе есть GROUP BY и агрегатная функция, поэтому пустые группы приходится добирать вручную
  • Не хватает o.created_at в GROUP BY, из-за чего строки с NULL схлопываются и теряются
  • Условие на правую таблицу в WHERE отбрасывает строки, где o.created_at равен NULL, и LEFT JOIN превращается в INNER JOIN — условие по дате нужно перенести в ON

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела