4.1 Колонки при группировке

Что еще очень важно, так это то, что если ты группируешь записи, то в разделе SELECT можно указывать только колонки, по которым группируются данные.

Ты не можешь написать запрос типа и указать в разделе SELECT колонку name:

SELECT brand, name
FROM product
GROUP BY brand

У тебя в таблице product есть куча строк с полем name, и не ясно значение какой строки нужно сюда подставить. Подумай еще раз: ты хочешь узнать количество продуктов каждого бренда и как в результирующую таблицу может попасть имя продукта?

Если ты используешь оператор GROUP BY, то в твой результат не могут попасть обычные строки, а только колонки по которым группируются данные и “вычисляемые колонки”, такие как COUNT(*)

4.2 Группировка по вычисляемым колонкам

Зато ты можешь выполнять группировку по нескольким колонкам и даже по вычисляемым колонкам. Пример:

SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year

И результат такого запроса:

hire_year total
2012 1
2013 1
2014 1
2015 2
2018 1

Давай разберем наш запрос.

В таблице employee у каждого сотрудника уникальная дата найма, поэтому сгруппировать данные по ней не получится – для каждой даты будет одна запись и группировка не будет иметь особого смысла. Но вот если мы перейдем от даты найма к году найма, то вполне может быть ситуация, когда в один и тот же год компания наняла нескольких сотрудников.

Давай еще раз посмотрим, как будет выглядеть эта таблица до группировки:

SELECT
 	id,
 	name,
 	YEAR(join_date) AS hire_year,
 	join_date
FROM employee

И результат такого запроса:

id name hire_year join_date
1 Иванов Иван 2012 2012-06-30
2 Петров Петр 2013 2013-08-12
3 Иванов Сергей 2014 2014-01-01
4 Рабинович Мойша 2015 2015-05-12
5 Кириенко Анастасия 2015 2015-10-10
6 Васька 2018 2018-11-11

А вот уже эту результирующую таблицу вполне можно сгруппировать по hire_year и узнать сколько людей было нанято в конкретный год.

4.3 Группировка по нескольким колонкам

Теперь давай попробуем узнать сколько сотрудников мы наняли в каждый месяц каждого года. Для этого нам нужно добавить в запрос не одно, а сразу два вычисляемых поля – год найма (hire_year) и месяц найма (hire_month).

Давай напишем такой запрос:

SELECT
 	id,
 	name,
 	YEAR(join_date) AS hire_year,
 	MONTH(join_date) AS hire_month,
 	join_date
FROM employee

И результат такого запроса:

id name hire_year hire_month join_date
1 Иванов Иван 2012 6 2012-06-30
2 Петров Петр 2013 8 2013-08-12
3 Иванов Сергей 2014 1 2014-01-01
4 Рабинович Мойша 2015 5 2015-05-12
5 Кириенко Анастасия 2015 10 2015-10-10
6 Васька 2018 11 2018-11-11

Если мы сгруппируем данные этой результирующей таблицы по месяцам, то просто объединим людей в группы, не обращая внимания на год их найма. А нам нужно чтобы в результирующей таблице было три колонки: год, месяц и количество нанятых сотрудников.

Для этого после оператора GROUP BY нужно использовать название не одной колонки, а двух. Пример:

SELECT
 	YEAR(join_date) AS hire_year,
 	MONTH(join_date) AS hire_month,
 	COUNT(*) AS total
FROM employee
GROUP BY hire_year, hire_month

И результат такого запроса:

hire_year hire_month total
2012 6 1
2013 8 1
2014 1 1
2015 5 1
2015 10 1
2018 11 1

Записей в таблице у нас мало, так что в колонке total везде стоят единицы. И кстати, обратите внимание, что чем по большему количеству колонок мы группируем, тем больше у нас строк в результате.