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 везде стоят единицы. И кстати, обратите внимание, что чем по большему количеству колонок мы группируем, тем больше у нас строк в результате.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ