1. Колонки під час групування

Важливо те, що якщо ти групуєш записи, в розділі SELECT можна вказувати тільки колонки, за якими групуються дані.

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


SELECT brand, name
FROM product
GROUP BY brand
        

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

Якщо ти використовуєш оператор GROUP BY, то до твого результату не можуть потрапити звичайні рядки — лише колонки, за якими групуються дані та колонки, що обчислюються, такі як COUNT(*)

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 і дізнатися, скільки людей найняли у конкретний рік.

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 скрізь стоять одиниці. І, до речі, зверни увагу: чим більшою є кількість колонок, за якими ми групуємо, тим більше у нас рядків у результаті.