Выбор ответа Senior SQL для аналитика обновлено

Подсчёт клиентов с оплатами

Вопрос

Нужно посчитать клиентов, у которых есть хотя бы один успешный платёж. Почему SELECT COUNT(*) FROM clients c JOIN orders o ... JOIN payments p ... WHERE p.status = 'succeeded' неверен?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: JOIN размножает клиента, нужен COUNT(DISTINCT) или EXISTS. Клиент с тремя успешными платежами посчитается три раза.

Варианты ответа

  1. WHERE нужно заменить на HAVING, потому что это условие на агрегат
  2. Запрос верен, каждый клиент посчитается один раз
  3. JOIN размножает клиента, нужен COUNT(DISTINCT) или EXISTSправильный ответ
  4. JOIN не работает с тремя таблицами в одном запросе

Разбор

Клиент с тремя успешными платежами посчитается три раза. Правильно считать уникальных клиентов COUNT(DISTINCT c.id) или фильтровать через EXISTS без размножения строк. Ограничения на число JOIN нет. HAVING нужен для условий на агрегаты, здесь условие на строки.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.