Напишите SQL запрос для вывода имен клиентов с не более чем пятью счетами
Что проверяют
Заметите ли вы, что порог не больше пяти включает и клиентов, у которых счетов нет вовсе. Внутреннее соединение их выбрасывает, и ответ выходит тихо неполным: ошибки нет, просто в выдаче не хватает строк.
Как отвечать
select c.client_id, c.client_name, count(a.account_id) as accounts
from clients c
left join accounts a on a.client_id = c.client_id
group by c.client_id, c.client_name
having count(a.account_id) <= 5;Ключевых решения два. Соединение левое, чтобы клиент без счетов остался в выборке. Считается count по колонке из правой таблицы, а не count(*): после левого соединения у клиента без счетов остаётся ровно одна строка с пустыми полями, и count(*) насчитает ему единицу, тогда как count(a.account_id) даст честный ноль, потому что NULL не считается.
Группировать нужно по идентификатору, а не по имени: тёзки склеятся в одну группу и получат общее число счетов на двоих. Имя добавляется в GROUP BY только чтобы его можно было вывести. Если счета бывают закрытыми, условие по статусу ставится в ON левого соединения, а не в WHERE: в WHERE оно превратит левое соединение во внутреннее и вернёт вас к исходной ошибке.
Где спотыкаются
Пишут JOIN вместо LEFT JOIN. Запрос выполняется, глазами выглядит правильным, а клиенты с нулём счетов пропадают. Интервьюер ждёт именно эту строку.
Второе: count(*) в условии HAVING. С левым соединением он никогда не даёт ноль, и граница условия уезжает ровно на единицу.
Третье: пытаются фильтровать в WHERE, например проверкой a.account_id is not null или сразу условием на количество. Агрегат в WHERE запрещён, а проверка на пустое значение снова убивает смысл левого соединения.