Нужно построить отчёт: по каждому продукту и каждому дню месяца — сумма продаж, включая дни с нулевыми продажами. Как сформировать каркас из всех пар дата–продукт?

AИспользовать CROSS JOIN между таблицей дат и таблицей продуктов: декартово произведение всех пар
BИспользовать INNER JOIN между таблицей дат и таблицей продуктов по подходящему общему ключу
CИспользовать LEFT JOIN таблицы продуктов к таблице дат по столбцу created_at для каждой даты
DИспользовать UNION ALL таблицы дат и таблицы продуктов в один общий результат запроса
Правильный ответ. CROSS JOIN даёт декартово произведение: каждая дата сочетается с каждым продуктом, и получается полный каркас для LEFT JOIN к продажам.

Разбор

CROSS JOIN создаёт все возможные комбинации строк двух таблиц: если дат 30 и продуктов 5, получится 150 строк. Затем этот каркас соединяют через LEFT JOIN с таблицей продаж — для дней без продаж будут NULL, которые заменяют на 0 через COALESCE. INNER JOIN без ключа связи для пар дат и продуктов смысла не имеет, а UNION ALL просто склеивает строки и не порождает пар. Это стандартный паттерн «date spine» в аналитике.

Проверь себя · 1/3разбор после ответа
Аналитик написал SELECT * FROM orders, users без WHERE и без JOIN ... ON. В orders 1000 строк, в users 500 строк. Что вернёт запрос?
Тренировать SQL в Telegram

Ещё вопросы по теме «JOIN и операции множеств»