Напиши SQL запрос для вывода количества сотрудников в каждой локации с количеством больше восьми
Что проверяют
Умеете ли вы отличать WHERE от HAVING и не спешите ли с формулировкой «больше восьми». Задача элементарная, интересен разбор: интервьюер обычно тут же спрашивает, что будет с локацией, где сотрудников ровно восемь, и куда денутся строки с NULL.
Как отвечать
Начните с запроса:
SELECT location, count(*) AS employee_count
FROM employees
GROUP BY location
HAVING count(*) > 8
ORDER BY employee_count DESC;Дальше проговорите, что здесь важно:
>, а не>=: «больше восьми» это девять и выше, локация с восемью сотрудниками в выборку не попадает;HAVINGпротивWHERE:WHEREотсеивает строки до группировки,HAVINGотсеивает уже собранные группы. Условие про сотрудника (WHERE is_active) идёт вWHERE, условие про счётчик вHAVING;- *`count()
противcount(location)**: второй не считаетNULL`, и на этом различии строится половина каверзных вопросов; NULLв локации:GROUP BYсобирает всеNULLв одну группу, и она тоже пройдёт фильтр, если строк в ней больше восьми;- алиас в
HAVING: MySQL его разрешает, PostgreSQL нет, поэтому в переносимом запросе выражение повторяется целиком.
Если в таблице лежит location_id, добавьте джойн со справочником и группируйте по обоим полям (GROUP BY l.id, l.name), чтобы два офиса с одинаковым названием не слиплись в одну строку.
Для QA полезно вслух назвать тест-кейсы: локация ровно с восемью сотрудниками, с девятью, пустая таблица, названия с разным регистром и лишними пробелами, уволенные сотрудники в выборке. Как альтернативу упомяните оконный вариант count(*) OVER (PARTITION BY location), он нужен, когда вместе со счётчиком требуются сами строки.
Где спотыкаются
Ставят условие на счётчик в WHERE и получают ошибку про агрегат в условии. Агрегаты там не разрешены, потому что на этом шаге групп ещё не существует.
Читают «больше восьми» как «восемь и больше». Это самая частая потеря балла в задаче, где всё остальное написано верно.
Забывают положить неагрегированный столбец в GROUP BY. PostgreSQL сразу ответит ошибкой, а MySQL с выключенным ONLY_FULL_GROUP_BY молча выполнит запрос и вернёт произвольное значение из группы.