Написать SQL-запрос для производителей с более чем одной моделью и общей стоимостью товаров выше 80000
Что проверяют
Умеете ли вы перевести словесное условие в группировку и фильтр по агрегату. Два условия здесь одинаковы по природе: и «более одной модели», и «сумма выше 80000» считаются после группировки, значит живут в HAVING, а не в WHERE. Для питониста это ещё и вопрос про границу ответственности: агрегат считает база, а не цикл в приложении.
Как отвечать
Проговорите схему вслух, потому что она не дана. Пусть есть таблица товаров с полями производителя, модели и цены.
SELECT p.maker,
count(DISTINCT p.model) AS models,
sum(p.price) AS total
FROM products p
GROUP BY p.maker
HAVING count(DISTINCT p.model) > 1
AND sum(p.price) > 80000;Поясните выбор: WHERE отсеивает строки до группировки, HAVING отсеивает готовые группы, поэтому условие по sum и count может жить только во втором. DISTINCT внутри count нужен, если одна модель встречается несколькими строками, например по складам или по датам поставки. Уникальна модель или нет, это хороший уточняющий вопрос интервьюеру.
Если производители лежат отдельной таблицей, добавьте JOIN и группируйте по идентификатору, а имя выводите рядом с ним. Стоит упомянуть, что sum игнорирует NULL, поэтому у производителя с неизвестными ценами сумма выйдет заниженной, и иногда правильнее отбросить такие группы явно.
Где спотыкаются
Кладут условие по агрегату в WHERE и получают ошибку про недопустимость агрегатной функции. Обратная ошибка мягче, но хуже: тащат все строки в Python и складывают в цикле, потому что «так понятнее». На реальном объёме это лишний трафик и лишняя память.
Забывают про размножение строк. Как только к товарам присоединяется таблица поставок или заказов, каждая строка товара повторяется, sum(p.price) задваивается, и порог 80000 перестаёт что-либо значить. Лечится агрегатом в подзапросе до соединения.
Не сверяют пример с запросом. Классический провал: кандидат придумывает данные, объявляет ответом производителя с суммой 60000 и тут же сам пишет, что порог равен 80000. Прежде чем показывать пример, посчитайте его вручную.