Ответ
Чтобы получить количество элементов в каждой группе, я использую агрегатную функцию 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, а то будет тебе хиросима, а не результат. В остальном — хуй с горы, ничего сложного.