Как посчитать размер каждой группы при группировке в SQL?

Ответ

Чтобы получить количество элементов в каждой группе, я использую агрегатную функцию COUNT() в сочетании с оператором GROUP BY.

Базовый запрос:

SELECT 
    department_id, -- столбец для группировки
    COUNT(*) AS employee_count -- подсчет строк в группе
FROM 
    employees
GROUP BY 
    department_id;

Этот запрос вернет список отделов и количество сотрудников в каждом.

Важные нюансы и варианты использования:

  • *`COUNT()vsCOUNT(column_name):**COUNT(*)считает все строки в группе.COUNT(column_name)считает только не-NULL значения в указанном столбце. Например,COUNT(manager_id)` покажет, у скольких сотрудников в отделе указан руководитель.
  • Фильтрация групп (HAVING): Чтобы отфильтровать результат по размеру группы, использую HAVING, а не WHERE.
    SELECT 
        department_id, 
        COUNT(*) AS employee_count
    FROM 
        employees
    GROUP BY 
        department_id
    HAVING 
        COUNT(*) > 5; -- Только отделы с более чем 5 сотрудниками
  • Сортировка по размеру группы:
    SELECT 
        department_id, 
        COUNT(*) AS employee_count
    FROM 
        employees
    GROUP BY 
        department_id
    ORDER BY 
        employee_count DESC; -- От самого многочисленного отдела к самому маленькому
  • Группировка по нескольким полям: Можно группировать по комбинации столбцов.
    SELECT 
        department_id, 
        job_title, 
        COUNT(*) AS count
    FROM 
        employees
    GROUP BY 
        department_id, job_title;

Ответ 18+ 🔞

А, ну это же классика, ебушки-воробушки! Сейчас объясню, как это работает, чтобы ты сам от себя охуел от простоты.

Смотри, если тебе надо посчитать, сколько в каждом отделе народу работает, то ты просто делаешь вот такую штуку:

SELECT 
    department_id, -- вот по этому полю будем кучковаться
    COUNT(*) AS employee_count -- а это просто посчитает, сколько строк в каждой кучке набралось
FROM 
    employees
GROUP BY 
    department_id;

Всё, приехали. Запрос вернёт тебе список отделов и цифру — сколько там душ томится. Но тут есть подводные камни, на которых можно запросто обосраться, если не знать.

Первое — счётчик-то бывает разный. COUNT(*) посчитает вообще все строки в группе, даже если там в половине полей NULL болтается. А вот COUNT(column_name) — это хитрая жопа: он посчитает только те строки, где в указанном столбце значение не NULL. Допустим, COUNT(manager_id) покажет, скольким бедолагам в отделе назначили надсмотрщика, а остальные — вольные казаки.

Второе — фильтровать группы. Тут многие лажают. Нельзя использовать WHERE для фильтрации по результату агрегации (типа «где количество больше пяти»). Для этого есть отдельная команда — HAVING. Она как раз для таких случаев.

SELECT 
    department_id, 
    COUNT(*) AS employee_count
FROM 
    employees
GROUP BY 
    department_id
HAVING 
    COUNT(*) > 5; -- Вот так отсеем все отделы-карлики, где народу меньше пяти

Третье — сортировка. Чтобы сразу видеть, где толпа, а где один в поле воин, отсортируй по размеру группы.

SELECT 
    department_id, 
    COUNT(*) AS employee_count
FROM 
    employees
GROUP BY 
    department_id
ORDER BY 
    employee_count DESC; -- Поставим в начале самых укомплектованных, пусть начальство гордится

И наконец, группировка по нескольким полям. Это когда тебе надо разбить не просто по отделам, а внутри отдела ещё и по должностям посмотреть. Получится такая вложенная структура, как матрёшка.

SELECT 
    department_id, 
    job_title, 
    COUNT(*) AS count
FROM 
    employees
GROUP BY 
    department_id, job_title;

Вот и вся магия. Главное — не перепутай WHERE с HAVING, а то будет тебе хиросима, а не результат. В остальном — хуй с горы, ничего сложного.