Sobes.tech
Назад к вопросам
Middle
7

Как сделать SQL запрос для подсчета количества сотрудников в категориях зарплаты с выводом 0 для пустых категорий?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать, что для подсчета по категориям используется LEFT JOIN с таблицей-справочником категорий или генерация полного набора категорий. Тогда даже пустые категории попадут в результат с нулем. Обычно итог строится через GROUP BY и COUNT, а пропуски заменяются на 0 через COALESCE.

Определение:

Задача решается так, чтобы сначала получить полный список всех возможных категорий зарплаты, а затем присоединить к нему сотрудников. Если в какой-то категории сотрудников нет, строка все равно останется в результате, а количество будет равно нулю. Для этого обычно используют LEFT JOIN от списка категорий к агрегированным данным или к таблице сотрудников напрямую.

Пример использования:

Например, есть категории зарплаты low, middle, high, но в данных сотрудники есть только в middle и high. Чтобы показать 0 для low, можно взять отдельную таблицу категорий и присоединить к ней подсчет сотрудников.

SELECT
    c.salary_category,
    COALESCE(e.cnt, 0) AS employee_count
FROM salary_categories c
LEFT JOIN (
    SELECT
        salary_category,
        COUNT(*) AS cnt
    FROM employees
    GROUP BY salary_category
) e
    ON e.salary_category = c.salary_category
ORDER BY c.salary_category;

Пояснение кода:

  1. salary_categories — таблица или подзапрос со всеми возможными категориями зарплаты, включая те, где пока нет сотрудников.
  2. В подзапросе по employees считается количество сотрудников в каждой категории через GROUP BY salary_category.
  3. LEFT JOIN гарантирует, что все категории из salary_categories попадут в результат.
  4. Если для категории нет совпадений, поле cnt будет NULL.
  5. COALESCE(e.cnt, 0) заменяет NULL на 0, чтобы пустые категории отображались с нулевым количеством.

Ключевые моменты:

  • Нужен не INNER JOIN, а LEFT JOIN, иначе пустые категории исчезнут.
  • Полный список категорий должен быть заранее известен: из справочника, CTE или VALUES.
  • COUNT(*) считают внутри группировки, а не после объединения без контроля за пустыми категориями.
  • COALESCE используется именно для замены NULL на 0.
  • Если справочника категорий нет, его обычно создают через CTE или явный список значений.