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