Sql group: Команда GROUP BY — группировка при выборке из базы данных

Команда GROUP BY - группировка при выборке из базы данных

Команда GROUP BY позволяет группировать результаты при выборке из базы данных.

К сгруппированным результатам можно применять любые функции (смотрите примеры).

См. также команду HAVING, которая позволяет накладывать условие на группы, созданные с помощью GROUP BY.

Содержание

Синтаксис

SELECT * FROM имя_таблицы WHERE условие GROUP BY поле_для_группировки

Примеры

Все примеры будут по этой таблице workers, если не сказано иное:

id
айди
name
имя
age
возраст
salary
зарплата
1Дима23100
2Петя23200
3Вася23300
4Коля241000
5Иван242000
6Кирилл251000

Пример

В данном примере записи группируются по возрасту (будет 3 группы - 23 года, 24 года и 25 лет). Затем для каждой группы применяется функция SUM, которая суммирует зарплаты внутри данной группы.

В результате для каждой из групп (23 года, 24 года и 25 лет) будет подсчитана суммарная зарплата внутри этой группы:

SELECT age, SUM(salary) as sum FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
sum
сумма
23600
243000
251000

Пример

В данном примере мы используем дополнительное условие WHERE, чтобы взять не все записи из таблицы:

SELECT age, SUM(salary) as sum FROM workers WHERE id>=2 GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
sum
сумма
23500
243000
251000

Пример

В данном примере записи группируются по возрасту (будет 3 группы - 23 года, 24 года и 25 лет). Затем для каждой группы применяется функция MAX, которая находит максимальную зарплату внутри данной группы:

SELECT age, MAX(salary) as max FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
max
максимальная зарплата
23300
242000
251000

Пример

А теперь с помощью функции MIN найдется минимальная зарплата внутри данной группы:

SELECT age, MIN(salary) as min FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
min
минимальная зарплата
23100
241000
251000

Пример

А теперь с помощью функции COUNT найдется количество записей в группе:

SELECT age, COUNT(*) as count FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age
возраст
count
количество
233
242
251

SQL оператор GROUP BY — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

В этом учебном материале вы узнаете, как использовать SQL оператор GROUP BY с синтаксисом и примерами.

Описание

SQL оператор GROUP BY можно использовать в операторе SELECT для сбора данных по нескольким записям и группировки результатов по одному или нескольким столбцам.

Синтаксис

Синтаксис оператора GROUP BY в SQL:

SELECT expression1, expression2, … expression_n,
aggregate_function (aggregate_expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, … expression_n
[ORDER BY expression [ ASC | DESC ]];

Параметры или аргументы

expression1, expression2, … expression_n
Выражения, которые не инкапсулированы в агрегатную функцию и должны быть включены в GROUP BY в конце SQL-запроса.
aggregate_function
Это агрегатная функция, такая как SUM, COUNT, MIN, MAX или AVG.
aggregate_expression
Это столбец или выражение, для которого будет использоваться aggregate_function.
tables
Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица.
WHERE conditions
Необязательный. Это условия, которые должны быть выполнены для выбора записей.
ORDER BY expression
Необязательный. Выражение, используемое для сортировки записей в наборе результатов. Если указано более одного выражения, значения должны быть разделены запятыми.
ASC
Необязательный. ASC сортирует результирующий набор в порядке возрастания по expression. Это поведение по умолчанию, если модификатор не указан.
DESC
Необязательный. DESC сортирует результирующий набор в порядке убывания по expression.

Пример — использование GROUP BY с функцией SUM

Давайте посмотрим, как использовать GROUP BY с функцией SUM в SQL.
В этом примере у нас есть таблица employees со следующими данными:

employee_numberfirst_namelast_namesalarydept_id
1001JustinBieber62000500
1002SelenaGomez57500500
1003MilaKunis71000501
1004TomCruise42000501

Введите следующий SQL оператор:

SELECT dept_id, SUM(salary) AS total_salaries FROM employees GROUP BY dept_id;

SELECT dept_id,

       SUM(salary) AS total_salaries

  FROM employees

GROUP BY dept_id;

Будет выбрано 2 записи. Вот результаты, которые вы получите:

dept_idtotal_salaries
500119500
501113000

В этом примере мы использовали функцию SUM, чтобы сложить все зарплаты для каждого dept_id, и мы результатам SUM(salary) указали псевдоним «total_salaries». Поскольку dept_id не инкапсулирован в функцию SUM, он должен быть указан в предложении GROUP BY.

Пример — использование GROUP BY с функцией COUNT

Давайте посмотрим, как использовать предложение GROUP BY с функцией COUNT в SQL.

В этом примере у нас есть таблица products со следующими данными:

product_idproduct_namecategory_id
1Pear50
2Banana50
3Orange50
4Apple50
5Bread75
6Sliced Ham25
7KleenexNULL

Введите следующий SQL оператор:

SELECT category_id, COUNT(*) AS total_products FROM products WHERE category_id IS NOT NULL GROUP BY category_id ORDER BY category_id;

SELECT category_id,

   COUNT(*) AS total_products

  FROM products

WHERE category_id IS NOT NULL

GROUP BY category_id

ORDER BY category_id;

Будет выбрано 3 записи. Вот результаты, которые вы должны получить:

category_idtotal_products
251
504
751

В этом примере мы использовали функцию COUNT для вычисления количества total_products для каждого category_id, и мы указали псевдоним «total_products» как результаты функции COUNT. Мы исключили все значения category_id, которые имеют значение NULL, отфильтровав их в предложении WHERE. Поскольку category_id не инкапсулирован в функции COUNT, он должен быть указан в предложении GROUP BY.

Пример — использование GROUP BY с функцией MIN

Давайте теперь посмотрим, как использовать предложение GROUP BY с функцией MIN в SQL.

В этом примере мы снова будем использовать таблицу employees со следующими данными:

employee_numberfirst_namelast_namesalarydept_id
1001JustinBieber62000500
1002SelenaGomez57500500
1003MilaKunis71000501
1004TomCruise42000501

Введите следующий SQL оператор:

SELECT dept_id, MIN(salary) AS lowest_salary FROM employees GROUP BY dept_id;

SELECT dept_id,

       MIN(salary) AS lowest_salary

  FROM employees

GROUP BY dept_id;

Будет выбрано 2 записи. Вот результаты, которые вы получите:

dept_idlowest_salary
50057500
50142000

В этом примере мы использовали функцию MIN, чтобы вернуть самое минимальное значение salary для каждого dept_id, и мы присвоили результатам функции MIN псевдоним «lowest_salary». Поскольку dept_id не инкапсулирован в функцию MIN, он должен быть указан в предложении GROUP BY.

Пример — использование GROUP BY с функцией MAX

Наконец, давайте посмотрим, как использовать предложение GROUP BY с функцией MAX.

Давайте снова воспользуемся таблицей employees, но на этот раз найдем самую максимальную зарплату для каждого dept_id:

employee_numberfirst_namelast_namesalarydept_id
1001JustinBieber62000500
1002SelenaGomez57500500
1003MilaKunis71000501
1004TomCruise42000501

Введите следующий SQL оператор:

SELECT dept_id, MAX(salary) AS highest_salary FROM employees GROUP BY dept_id;

SELECT dept_id,

   MAX(salary) AS highest_salary

  FROM employees

GROUP BY dept_id;

Будет выбрано 2 записи. Вот результаты, которые вы должны получить:

dept_idhighest_salary
50062000
50171000

В этом примере мы использовали функцию MAX, чтобы вернуть самое максимальное значение salary для каждого dept_id, и мы присвоили псевдоним «highest_salary» результату функции MAX. Столбец dept_id должен быть указан в предложении GROUP BY, поскольку он не инкапсулирован в функции MAX.

SQL GROUP BY - группировка в запросах

Оператор SQL GROUP BY служит для распределения строк - результата запроса - по группам, в которых значения некоторого столбца, по которому происходит группировка, являются одинаковыми. Группировку можно производить как по одному столбцу, так и по нескольким.

Часто оператор SQL GROUP BY применяется вместе с агрегатными функциями (COUNT, SUM, AVG, MAX, MIN). В этих случаях агрегатные функции служат для вычисления соответствующего агрегатного значения ко всему набору строк, для которых некоторый столбец - общий.

Оператор GROUP BY имеет следующий синтаксис:

SELECT ИМЕНА_СТОЛБЦОВ FROM ИМЯ_ТАБЛИЦЫ [WHERE УСЛОВИЕ] GROUP BY ИМЕНА_СТОЛБЦОВ

Если в результате запроса требуется вывести один столбец и по этому же столбцу производится группировка, то оператор GROUP BY просто выбирает уникальные значения и убирает дубликаты, то есть выполняет те же задачи, что и ключевое слово DISTINCT.

Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.

Скрипт для создания базы данных библиотеки, её таблиц и заполения таблиц данными - в файле по этой ссылке.

В примерах работаем с базой данных библиотеки и ее таблицей "Книга в пользовании" (Bookinuse). Отметим, что оператор GROUP BY ведёт себя несколько по-разному в MySQL и в MS SQL Server. Эти различия будут показаны на примерах.

AuthorTitlePubyearInv_NoCustomer_ID
ТолстойВойна и мир20052865
ЧеховВишневый сад20001731
ЧеховИзбранные рассказы201119120
ЧеховВишневый сад1991565
Ильф и ПетровДвенадцать стульев1985331
МаяковскийПоэмы19832120
ПастернакДоктор Живаго200669120
ТолстойВоскресенье20067747
ТолстойАнна Каренина19897205
ПушкинКапитанская дочка20042547
ГогольПьесы20078147
ЧеховИзбранные рассказы19874205
ПушкинСочинения, т.11984647
ПастернакИзбранное200013718
ПушкинСочинения, т.219848205
NULLНаука и жизнь 9 2018201912718
ЧеховРанние рассказы200117131

Пример 1. Вывести авторов выданных книг, сгруппировав их. Пишем следующий запрос:

SELECT Author FROM BOOKINUSE GROUP BY Author

Этот запрос вернёт следующий результат:

Author
NULL
Гоголь
Ильф и Петров
Маяковский
Пастернак
Пушкин
Толстой
Чехов

Как видим, в таблице стало меньше строк, так как фамилии авторов остались каждая по одной.

В следующем примере увидим, что оператор GROUP BY не следует путать с оператором ORDER BY и поймём, чем эти операторы отличаются друг от друга.

Пример 2. Вывести авторов и названия выданных книг, сгруппировав по авторам. Пишем следующий запрос, который допустим в MySQL:

SELECT Author, Title FROM Bookinuse GROUP BY Author

Этот запрос вернёт следующий результат:

AuthorTitle
NULLНаука и жизнь 9 2018
ГогольПьесы
Ильф и ПетровДвенадцать стульев
МаяковскийПоэмы
ПастернакДоктор Живаго
ПушкинКапитанская дочка
ТолстойВойна и мир
ЧеховВишнёвый сад

Как видим, в таблице каждому автору соответствует лишь одна книга, причём та, которая в таблице BOOKINUSE является первой по порядку записей.

Если бы нам требовалось вывести все книги, причём авторы должны были бы следовать не "вразброс", а по порядку: сначала Гоголь и все его книги, затем другие авторы и все их книги, то мы применили бы не оператор GROUP BY, а оператор ORDER BY.

По-другому ведёт себя оператор GROUP BY в MS SQL Server.

И всё же вывести все записи, соответствующие значению столбца, по которому происходит группировка, можно. Но в этом случае в результирующей таблице должен появиться ещё один столбец. Такой случай проиллюстирован в следующем примере.

Пример 3. Вывести авторов, названия выданных книг, ID пользователя и инвентарный номер выданной книги. Сгруппировать по авторам, ID пользователя и инвентарному номеру. На MySQL запрос будет следующим:

SELECT Author, Title, Customer_ID, Inv_no FROM Bookinuse GROUP BY Author, Customer_ID, Inv_no

Этот запрос вернёт следующий результат:

AuthorTitleCustomer_IDInv_no
ГогольПьесы4781
Ильф и ПетровДвенадцать стульев313
МаяковскийПоэмы1202
ПастернакИзбранное18137
ПастернакДоктор Живаго12069
ПушкинКапитанская дочка4725
ПушкинСочинения, т.1476
ПушкинСочинения, т.22058
ТолстойВоскресенье4777
ТолстойВойна и мир6528
ТолстойАнна Каренина2057
ЧеховВишневый сад3119
ЧеховРанние рассказы31171
ЧеховВишневый сад655
ЧеховИзбранные рассказы12019
ЧеховИзбранные рассказы2054

Как видим, в результирующей таблице присутствуют все книги всех авторов, причём авторы следуют по порядку, как если бы мы применили оператор ORDER BY. Кроме того, видно, что записи сгруппированы и по второму указанному столбцу - Customer_ID. Так, у автора Пушкина сначала перечисляются книги, выданные пользователю с Customer_ID 47, а затем - 205. У автора Чехова сначала перечисляются книги, выданные пользователю с Customer_ID 31, а затем - с другими номерами. Третий столбец, по которому происходит группировка - Inv_no - добавлен только для того, чтобы в результирующей таблице выводились все строки, соответствующие значениям ранее перечисленных столбцов для группировки, а не только уникальные.

По-другому ведёт себя оператор GROUP BY в MS SQL Server и в случае этого запроса.

Агрегатные функции COUNT, SUM, AVG, MAX, MIN служат для вычисления соответствующего агрегатного значения ко всему набору строк, для которых некоторый столбец - общий.

Пример 4. Вывести количество выданных книг каждого автора. Запрос будет следующим:

SELECT Author, COUNT(*) AS InUse FROM Bookinuse GROUP BY Author

Результатом выполнения запроса будет следующая таблица:

AuthorInUse
NULL1
Гоголь1
Ильф и Петров1
Маяковский1
Пастернак2
Пушкин3
Толстой3
Чехов5

Пример 5. Вывести количество книг, выданных каждому пользователю. Запрос будет следующим:

SELECT Customer_ID, COUNT(*) AS InUse FROM Bookinuse GROUP BY Customer_ID

Результатом выполнения запроса будет следующая таблица:

User_IDInUse
181
313
474
652
1203
2053

Примеры запросов к базе данных "Библиотека" есть также в уроках по оператору IN, предикату EXISTS и функциям CONCAT, COALESCE.

На сайте есть более подробный материал об агрегатных функциях и их совместном использовании с оператором GROUP BY.

Поделиться с друзьями

Реляционные базы данных и язык SQL

MS SQL Server и T-SQL

Операторы GROUP BY и HAVING

Последнее обновление: 19.07.2017

Для группировки данных в T-SQL применяются операторы GROUP BY и HAVING, для использования которых применяется следующий формальный синтаксис:


SELECT столбцы
FROM таблица
[WHERE условие_фильтрации_строк]
[GROUP BY столбцы_для_группировки]
[HAVING условие_фильтрации_групп]
[ORDER BY столбцы_для_сортировки]

GROUP BY

Оператор GROUP BY определяет, как строки будут группироваться.

Например, сгруппируем товары по производителю


SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer

Первый столбец в выражении SELECT - Manufacturer представляет название группы, а второй столбец - ModelsCount представляет результат функции Count, которая вычисляет количество строк в группе.

Стоит учитывать, что любой столбец, который используется в выражении SELECT (не считая столбцов, которые хранят результат агрегатных функций), должны быть указаны после оператора GROUP BY. Так, например, в случае выше столбец Manufacturer указан и в выражении SELECT, и в выражении GROUP BY.

И если в выражении SELECT производится выборка по одному или нескольким столбцам и также используются агрегатные функции, то необходимо использовать выражение GROUP BY. Так, следующий пример работать не будет, так как он не содержит выражение группировки:


SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products

Другой пример, добавим группировку по количеству товаров:


SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer, ProductCount

Оператор GROUP BY может выполнять группировку по множеству столбцов.

Если столбец, по которому производится группировка, содержит значение NULL, то строки со значением NULL составят отдельную группу.

Следует учитывать, что выражение GROUP BY должно идти после выражения WHERE, но до выражения ORDER BY:


SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price > 30000
GROUP BY Manufacturer
ORDER BY ModelsCount DESC

Фильтрация групп. HAVING

Оператор HAVING определяет, какие группы будут включены в выходной результат, то есть выполняет фильтрацию групп.

Применение HAVING во многом аналогично применению WHERE. Только есть WHERE применяется к фильтрации строк, то HAVING используется для фильтрации групп.

Например, найдем все группы товаров по производителям, для которых определено более 1 модели:


SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
GROUP BY Manufacturer
HAVING COUNT(*) > 1

При этом в одной команде мы можем использовать выражения WHERE и HAVING:


SELECT Manufacturer, COUNT(*) AS ModelsCount
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING COUNT(*) > 1

То есть в данном случае сначала фильтруются строки: выбираются те товары, общая стоимость которых больше 80000. Затем выбранные товары группируются по производителям. И далее фильтруются сами группы - выбираются те группы, которые содержат больше 1 модели.

Если при этом необходимо провести сортировку, то выражение ORDER BY идет после выражения HAVING:


SELECT Manufacturer, COUNT(*) AS Models, SUM(ProductCount) AS Units
FROM Products
WHERE Price * ProductCount > 80000
GROUP BY Manufacturer
HAVING SUM(ProductCount) > 2
ORDER BY Units DESC

В данном случае группировка идет по производителям, и также выбирается количество моделей для каждого производителя (Models) и общее количество всех товаров по всем этим моделям (Units). В конце группы сортируются по количеству товаров по убыванию.

GROUP BY в SQL

Вы здесь: Главная - MySQL - SQL - GROUP BY в SQL

GROUP BY в SQL

Одной из важных команд в SQL является GROUP BY. Данная конструкция создана для выборки отдельных групп строк из таблицы, к каждой из которых применяются функции, указанные в SELECT (например, COUNT(), MIN() и так далее). Давайте разберём GROUP BY в SQL на конкретных примерах.

Допустим, у нас есть таблица супермаркетов:

  • id - уникальный идентификатор.
  • shop_id - уникальный идентификатор супермаркета.
  • price - цена на молоко.

Нам необходимо узнать среднюю цену на молоко у каждого супермаркета. Обратите внимание, что shop_id может повторяться (ведь есть сети супермакетов). Поэтому нам необходимо сделать группу по shop_id, и для каждой строки в этой группе вычислить среднюю цену.

Исходная таблица выглядит следующим образом:

id shop_id price
1 1 40
2 2 36
3 1 35
4 3 38
5 4 39
6 3 38
7 3 35

Для решения нашей задачи мы используем GROUP BY:

SELECT `shop_id`, AVG(`price`) FROM `table` GROUP BY `shop_id`

В результате получится следующее:

shop_id AVG(`price`)
1 37.5
2 36.0
3 37.0
4 39.0

Таким образом, мы узнали среднюю цену в конкретной сети супермаркетов (или в одиночном магазине).

Ещё одним очень частым применением GROUP BY в SQL является выборка уникальных записей из таблиц. В предыдущем примере Вы заметили, что в результирующей выборке нет повторяющихся shop_id, тогда как в исходной таблице они были.

Допустим, у нас есть таблица с пользователями:

  • id - уникальный идентификатор.
  • email - e-mail пользователя.
  • hash - уникальный хэш пользователя.

И перед нами встала задача выбрать уникальных пользователей, причём именно уникальных людей, а не уникальных учётных записей. Ведь у одного человека может быть и 100 аккаунтов с разными e-mail и, разумеется, id. А hash - это некая строка, характеризующая его как уникального человека.

Таким образом, нам надо выбрать все записи с уникальным hash. Для этого опять же используется GROUP BY:

SELECT * FROM `table` GROUP BY `hash`

В результате, будут извлечены только уникальные hash, то есть 2 одинаковых hash в результирующей выборке Вы не увидите.

Вот таких два практических примера использования GROUP BY в SQL мы разобрали.

  • GROUP BY в SQL Создано 09.09.2013 12:31:55
  • GROUP BY в SQL Михаил Русаков
Предыдущая статья Следующая статья

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:
    <a href="https://myrusakov.ru" target="_blank"><img src="https://myrusakov.ru/images/button.gif" alt="Как создать свой сайт" /></a>

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:
    <a href="https://myrusakov.ru" target="_blank">Как создать свой сайт</a>

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):
    [URL="https://myrusakov.ru"]Как создать свой сайт[/URL]

в чем разница между GROUP BY и ORDER BY в sql

ЗАКАЗ: сортировка данных в порядке возрастания или убывания.

рассмотрим клиенты стол:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

ниже приведен пример, который будет сортировать результаты в порядке возрастания по имени:

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME;

это приведет к следующему результату:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
+----+----------+-----+-----------+----------+

ГРУППЫ: упорядочить идентичные данные в группы.

теперь клиенты таблица следующие записи с повторяющимися именами:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Ramesh   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | kaushik  |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

если вы хотите сгруппировать идентичные имена в одно имя, то группа по запросу будет выглядеть следующим образом:

SQL> SELECT * FROM CUSTOMERS
     GROUP BY NAME;

это приведет к следующему результату: (для идентичных имен он выберет последний и, наконец, отсортирует столбец в порядке возрастания)

    +----+----------+-----+-----------+----------+   
    | ID | NAME     | AGE | ADDRESS   | SALARY   |
    +----+----------+-----+-----------+----------+
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |
    |  4 | kaushik  |  25 | Mumbai    |  6500.00 |
    |  6 | Komal    |  22 | MP        |  4500.00 |
    |  7 | Muffy    |  24 | Indore    | 10000.00 |
    |  2 | Ramesh   |  25 | Delhi     |  1500.00 |
    +----+----------+-----+-----------+----------+

как вы заключили,что он бесполезен без SQL-функций, таких как sum, avg и т. д..

так пройти через это определение поймите правильное использование GROUP BY:

предложение GROUP BY работает над строками, возвращаемыми запросом путем суммирования идентичные строки в одну / отдельную группу и возвращает одну строку с резюме для каждой группы, используя соответствующий агрегат функция в списке выбора, например COUNT (), SUM (), MIN (), MAX (), AVG(), так далее.

теперь, если вы хотите знать общую сумму зарплаты на каждого клиента( имя), то группа по запросу будет как следует:

SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
     GROUP BY NAME;

это приведет к следующему результату: (сумма зарплат идентичных имен и сортировка столбца имени после удаления идентичных имен)

+---------+-------------+
| NAME    | SUM(SALARY) |
+---------+-------------+
| Hardik  |     8500.00 |
| kaushik |     8500.00 |
| Komal   |     4500.00 |
| Muffy   |    10000.00 |
| Ramesh  |     3500.00 |
+---------+-------------+

Как эффективно его применять

Резюме : в этом руководстве вы узнаете, как использовать предложение SQL GROUP BY для группировки строк на основе одного или нескольких столбцов.

Введение в SQL GROUP BY условие

Группирование - это одна из самых важных задач, с которыми вам приходится сталкиваться при работе с базами данных. Чтобы сгруппировать строки в группы, используйте предложение GROUP BY.

Предложение GROUP BY является необязательным предложением оператора SELECT, который объединяет строки в группы на основе соответствующих значений в указанных столбцах.Одна строка возвращается для каждой группы.

Вы часто используете GROUP BY в сочетании с агрегатной функцией, такой как MIN, MAX, AVG, SUM или COUNT, чтобы вычислить показатель, который предоставляет информацию для каждой группы.

Ниже показан синтаксис предложения GROUP BY.

 

SELECT column1, column2, AGGREGATE_FUNCTION (столбец 3) ИЗ Таблица 1 ГРУППА ПО column1, column2;

Не обязательно включать статистическую функцию в предложение SELECT.Однако, если вы используете статистическую функцию, она вычислит итоговое значение для каждой группы.

Если вы хотите отфильтровать строки перед группировкой, добавьте предложение WHERE. Однако для фильтрации групп используется предложение HAVING.

Важно подчеркнуть, что предложение WHERE применяется до группировки строк, тогда как предложение HAVING применяется после группировки строк. Другими словами, предложение WHERE применяется к строкам, а предложение HAVING применяется к группам.

Чтобы отсортировать группы, вы добавляете предложение ORDER BY после предложения GROUP BY.

Столбцы, которые появляются в предложении GROUP BY, называются столбцами группировки . Если столбец группировки содержит значения NULL, все значения NULL объединяются в одну группу, поскольку предложение GROUP BY считает, что значения NULL равны.

Примеры SQL GROUP BY

Мы будем использовать таблицы сотрудников и отделов в примере базы данных, чтобы продемонстрировать, как работает предложение GROUP BY.

emp_dept_tables emp_dept_tables

Чтобы найти численность персонала каждого отдела, вы группируете сотрудников по столбцу департамент_ид и применяете функцию COUNT для каждой группы как следующий запрос:

 

SELECT department_id, COUNT (employee_id) численность персонала ИЗ сотрудников ГРУППА ПО department_id;

См. Это в действии

SQL GROUP BY example SQL GROUP BY example

SQL GROUP BY с INNER JOIN пример

Чтобы получить название отдела, вы объединяете таблицу сотрудников с таблицей отделов следующим образом:

 

ВЫБРАТЬ е.department_id, название отдела, COUNT (employee_id) численность персонала ИЗ сотрудники е ВНУТРЕННИЕ СОЕДИНЕНИЯ отделов d ON d.department_id = e.department_id ГРУППА ПО e.department_id;

См. Это в действии

SQL GROUP BY INNER JOIN example SQL GROUP BY INNER JOIN example

SQL GROUP BY с примером ORDER BY

Чтобы отсортировать отделы по численности персонала, добавьте предложение ORDER BY в виде следующего оператора:

 

SELECT e.department_id, название отдела, COUNT (employee_id) численность персонала ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ кафедры d ON d.Department_id = e.department_id GROUP BY e.department_id ЗАКАЗАТЬ по численности персонала DESC;

См. Это в действии

SQL GROUP BY ORDER BY example SQL GROUP BY ORDER BY example

Обратите внимание, что в предложении ORDER BY можно использовать либо псевдоним численности персонала , либо COUNT (employee_id) .

SQL GROUP BY с HAVING пример

Чтобы найти отдел с численностью персонала более 5, вы используете предложение HAVING в качестве следующего запроса:

 

SELECT e.department_id, название отдела, COUNT (employee_id) численность персонала ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ кафедры d ON d.Department_id = e.department_id GROUP BY e.department_id Иметь численность персонала> 5 ЗАКАЗАТЬ по численности персонала DESC;

См. Это в действии

SQL GROUP BY HAVING example SQL GROUP BY HAVING example

SQL GROUP BY с примером MIN, MAX и AVG

Следующий запрос возвращает минимальную, максимальную и среднюю зарплату сотрудников в каждом отделе.

 

SELECT e.department_id, название отдела, MIN (зарплата) min_salary, MAX (зарплата) max_salary, КРУГЛЫЙ (AVG (зарплата), 2) средняя_ зарплата ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ кафедры d ON d.Department_id = e.department_id GROUP BY e.department_id;

См. Это в действии

SQL GROUP BY MIN MAX AVG example SQL GROUP BY MIN MAX AVG example

SQL GROUP BY с примером функции SUM

Чтобы получить общую зарплату по отделу, вы применяете функцию SUM к столбцу оклад и группируете сотрудников по столбцу Department_id как следует:

 

ВЫБРАТЬ e.department_id, название отдела, SUM (зарплата) total_salary ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ кафедры d ON d.Department_id = e.department_id GROUP BY e.department_id;

См. Это в действии

SQL GROUP BY with SUM example SQL GROUP BY with SUM example

SQL GROUP BY по нескольким столбцам

До сих пор вы видели, что мы сгруппировали всех сотрудников по одному столбцу. Например, следующий пункт

 

GROUP BY отдела_ид

помещает все строки с одинаковыми значениями в столбце отдел_ид в одну группу.

Как насчет группировки сотрудников по значениям в столбцах Department_id и job_id ?

 

GROUP BY отдела_идента, job_id

В этом пункте все сотрудники с одинаковыми значениями будут объединены в столбцы отдела_ид и job_id в одну группу.

Следующий оператор группирует строки с одинаковыми значениями в столбцах Department_id и job_id в одной группе, а затем возвращает строки для каждой из этих групп.

 

SELECT e.department_id, название отдела, e.job_id, название работы, COUNT (employee_id) ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ кафедры d ON d.department_id = e.department_id ВНУТРЕННЕЕ СОЕДИНЕНИЕ вакансии j ON j.job_id = e.job_id GROUP BY e.department_id, e.job_id;

См. Это в действии

SQL GROUP BY multiple columns example SQL GROUP BY multiple columns example

Отделение 2, 3 и 5 кажется более чем одним.

Это потому, что в этих отделах есть сотрудники, которые занимают разные должности. Например, в отделе отгрузки есть 2 сотрудника, выполняющих работу клерка доставки, 1 сотрудник, выполняющий работу клерка склада, и 4 сотрудника, выполняющие работу менеджера склада.

SQL GROUP BY и DISTINCT

Если вы используете предложение GROUP BY без агрегатной функции, предложение GROUP BY ведет себя как оператор DISTINCT.

Ниже приведены номера телефонов сотрудников, а также сгруппированы строки по номерам телефонов.

 

SELECT телефонный номер ИЗ сотрудников ГРУППА ПО телефонный номер;

См. Это в действии

Обратите внимание, что телефонные номера отсортированы.

Следующий оператор также извлекает телефонные номера, но вместо использования предложения GROUP BY он использует оператор DISTINCT .

 

ВЫБЕРИТЕ DISTINCT телефонный номер ИЗ сотрудники;

См. Это в действии

Набор результатов тот же, за исключением того, что набор, возвращенный оператором DISTINCT , не отсортирован.

В этом руководстве мы показали, как использовать предложение GROUP BY для суммирования строк в группы и применения функции агрегирования к каждой группе.

  • Был ли этот урок полезным?
  • Да Нет
.

SQL GROUP BY, COUNT - с примерами

Какова цель предложения GROUP BY?

  • Предложение GROUP BY группирует записи в итоговые строки.
  • GROUP BY возвращает одну запись для каждой группы.
  • запросов GROUP BY часто включают агрегаты: COUNT, MAX, SUM, AVG и т. Д.
  • GROUP BY может группировать по одному или нескольким столбцам.

Синтаксис SQL GROUP BY

Общий синтаксис

ВЫБЕРИТЕ имена столбцов
  ОТ таблицы
 ГДЕ состояние
 GROUP BY имена столбцов
 

Общий синтаксис с ORDER BY:

ВЫБЕРИТЕ имена столбцов
  ОТ таблицы
 ГДЕ состояние
 GROUP BY имена столбцов
 ЗАКАЗАТЬ ПО ИМЯ столбца
 

ЗАКАЗЧИК
Id
Имя
Фамилия
Город
Страна
Телефон

SQL GROUP BY Примеры

Проблема: Укажите количество клиентов в каждой стране.

ВЫБЕРИТЕ СЧЕТ (Id), Страна
  ОТ клиента
 ГРУППА ПО СТРАНЕ
 

Результат: 21 запись.

Количество Страна
3 Аргентина
2 Австрия
2 Бельгия
9 Бразилия
3 Канада


ЗАКАЗЧИК
Id
Имя
Фамилия
Город
Страна
Телефон

Задача: Указать количество клиентов
в каждой стране отсортировано по убыванию

ВЫБЕРИТЕ СЧЕТ (Id), Страна
  ОТ клиента
 ГРУППА ПО СТРАНЕ
 ЗАКАЗАТЬ ПО СЧЕТУ (Id) DESC
 

Результат: 21 запись.

Количество Страна
13 США
11 Франция
11 Германия
9 Бразилия
7 Великобритания

ЗАКАЗЧИК
Id
Имя
Фамилия
Город
Страна
Телефон
ЗАКАЗАТЬ
Id
ЗаказатьДата
Заказать №
CustomerId
Общая сумма

Задача: Перечислите общую сумму заказанных
для каждого клиента

ВЫБЕРИТЕ СУММУ (O.TotalAmount) AS SUM, C.FirstName, C.LastName
  ОТ [Заказ] O ПРИСОЕДИНЯЙТЕСЬ К Клиенту C
    ON O.CustomerId = C.Id
 GROUP BY C.FirstName, C.LastName
 ЗАКАЗАТЬ ПО СУММЕ (O.TotalPrice) DESC
 

Этот запрос объединяет заказ с клиентом для получения имен клиентов

Результат: 89 записей.

Сумма Имя Фамилия
117483.39 Хорст Клосс
115673,39 Хосе Паваротти
113236,68 Роланд Мендель
57317,39 Патриция МакКенна
52245.90 Паула Уилсон
34101.15 Марио Pontes
32555,55 Мария Ларссон
,

SQL Server GROUP BY

Резюме : в этом руководстве вы узнаете, как использовать предложение SQL Server GROUP BY для упорядочения строк в группах по одному или нескольким столбцам.

Введение в SQL Server Предложение GROUP BY

Предложение GROUP BY позволяет упорядочить строки запроса в группы. Группы определяются столбцами, указанными в предложении GROUP BY .

Ниже показан синтаксис предложения GROUP BY :

 

SELECT список_выборки ИЗ table_name ГРУППА ПО column_name1, имя_ столбца2...;

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

Рассмотрим следующий пример:

 

SELECT Пользовательский ИД, YEAR (order_date) order_year ИЗ заказы на продажу ГДЕ customer_id IN (1, 2) СОРТИРОВАТЬ ПО Пользовательский ИД;

SQL Server GROUP BY clause SQL Server GROUP BY clause

В этом примере мы получили идентификатор клиента и заказанный год клиентов с идентификатором клиента один и два.

Как ясно видно из результатов, клиент с идентификатором 1 разместил один заказ в 2016 году и два заказа в 2018. Клиент с идентификатором два разместил два заказа в 2017 году и один заказ в 2018.

Давайте добавим Предложение GROUP BY для запроса, чтобы увидеть эффект:

 

SELECT Пользовательский ИД, YEAR (order_date) order_year ИЗ заказы на продажу ГДЕ customer_id IN (1, 2) ГРУППА ПО Пользовательский ИД, ГОД (дата заказа) СОРТИРОВАТЬ ПО Пользовательский ИД;

SQL Server GROUP BY clause example SQL Server GROUP BY clause example

Предложение GROUP BY организовало первые три строки в две группы, а следующие три строки - в две другие группы с уникальными комбинациями идентификатора клиента и года заказа.

С функциональной точки зрения предложение GROUP BY в приведенном выше запросе дало тот же результат, что и следующий запрос, использующий предложение DISTINCT :

 

SELECT DISTINCT Пользовательский ИД, YEAR (order_date) order_year ИЗ заказы на продажу ГДЕ customer_id IN (1, 2) СОРТИРОВАТЬ ПО Пользовательский ИД;

SQL Server GROUP BY - DISTINCT example SQL Server GROUP BY - DISTINCT example

SQL Server Предложение GROUP BY и агрегатные функции

На практике предложение GROUP BY часто используется с агрегатными функциями для генерации сводных отчетов.

Агрегатная функция выполняет вычисление для группы и возвращает уникальное значение для каждой группы. Например, COUNT () возвращает количество строк в каждой группе. Другими обычно используемыми агрегатными функциями являются SUM () , AVG () (в среднем), MIN () (минимум), MAX () (максимум).

Предложение GROUP BY организует строки в группы, а функция агрегирования возвращает сводку (количество, минимум, максимум, среднее, сумма и т. Д.) Для каждой группы.

Например, следующий запрос возвращает количество заказов, сделанных клиентом по годам:

 

SELECT Пользовательский ИД, YEAR (order_date) order_year, COUNT (order_id) order_placed ИЗ заказы на продажу ГДЕ customer_id IN (1, 2) ГРУППА ПО Пользовательский ИД, ГОД (дата заказа) СОРТИРОВАТЬ ПО Пользовательский ИД;

SQL Server GROUP BY clause - expression example SQL Server GROUP BY clause - expression example

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

 

SELECT Пользовательский ИД, YEAR (order_date) order_year, статус заказа ИЗ заказы на продажу ГДЕ customer_id IN (1, 2) ГРУППА ПО Пользовательский ИД, ГОД (дата заказа) СОРТИРОВАТЬ ПО Пользовательский ИД;

Подробнее Примеры предложений GROUP BY

Давайте рассмотрим еще несколько примеров, чтобы понять, как работает предложение GROUP BY .

Использование предложения GROUP BY с примером функции COUNT ()

Следующий запрос возвращает количество клиентов в каждом городе:

 

SELECT Город, COUNT (customer_id) customer_count ИЗ sales.customers ГРУППА ПО город СОРТИРОВАТЬ ПО город;

SQL Server GROUP BY - COUNT example SQL Server GROUP BY - COUNT example

В этом примере предложение GROUP BY группирует клиентов по городам, а функция COUNT () возвращает количество клиентов в каждом городе.

Аналогично, следующий запрос возвращает количество клиентов по штатам и городам.

 

SELECT Город, штат, COUNT (customer_id) customer_count ИЗ sales.customers ГРУППА ПО штат, город СОРТИРОВАТЬ ПО Город, штат;

SQL Server GROUP BY clause - multiple columns example SQL Server GROUP BY clause - multiple columns example

Использование предложения GROUP BY с функциями MIN и MAX , пример

Следующий оператор возвращает минимальные и максимальные прейскурантные цены всех продуктов с моделью 2018 по бренду:

 

SELECT имя бренда, MIN (list_price) min_price, MAX (list_price) max_price ИЗ производство.продукты р ВНУТРЕННЕЕ РЕШЕНИЕ production.brands b ON b.brand_id = p.brand_id ГДЕ model_year = 2018 ГРУППА ПО имя бренда СОРТИРОВАТЬ ПО имя бренда;

SQL Server GROUP BY - MIN and MAX example SQL Server GROUP BY - MIN and MAX example

В этом примере предложение WHERE обрабатывается перед предложением GROUP BY , как всегда.

Использование предложения GROUP BY с примером функции AVG ()

В следующем утверждении функция AVG () используется для возврата средней прейскурантной цены по бренду для всех продуктов с модельным годом 2018:

 

ВЫБРАТЬ имя бренда, AVG (list_price) avg_price ИЗ производство.продукты р ВНУТРЕННЕЕ РЕШЕНИЕ production.brands b ON b.brand_id = p.brand_id ГДЕ model_year = 2018 ГРУППА ПО имя бренда СОРТИРОВАТЬ ПО имя бренда;

SQL Server GROUP BY - AVG example SQL Server GROUP BY - AVG example

Использование предложения GROUP BY с примером функции SUM

См. Следующую таблицу order_items :

order_items order_items

В следующем запросе используется функция SUM () для получения чистого значения каждого заказ:

 

ВЫБРАТЬ номер заказа, СУММА ( количество * list_price * (1 - скидка) ) чистая стоимость ИЗ продажи.order_items ГРУППА ПО номер заказа;

SQL Server GROUP BY - SUM example SQL Server GROUP BY - SUM example

В этом руководстве вы узнали, как использовать предложение SQL Server GROUP BY для упорядочения строк в группах по указанному списку столбцов.

SQL GROUP BY

ϼƺ (СУММА) Ҫ ГРУППА ПО 䡣

ГРУППА BY

GROUP BY BY Ϻϼƺһж Խ з 顣

SQL GROUP BY �

ВЫБЕРИТЕ имя столбца, агрегатная функция (имя столбца)
FROM table_name
ГДЕ значение оператора column_name
GROUP BY column_name
 

SQL GROUP BY ʵ

ӵ "Заказы"

O_Id OrderDate ЗаказЦена Заказчик
1 2008/12/29 1000 куста
2 2008/11/23 1600 Картер
3 2008/10/05 700 куста
4 2008/09/28 300 куста
5 2008/08/06 2000 Адамс
6 2008/07/21 100 Картер

ܽܶ ϣÿͻ ܽܶ

Ҫʹ GROUP BY Կ ͻϡ

ʹ SQL 䣺

ВЫБЕРИТЕ клиента, СУММУ (OrderPrice) ОТ заказов
GROUP BY Клиент
 
Заказчик сум (OrderPrice)
куста 2000
Картер 1700
Адамс 2000

ԣ Բ ԣ

ǿһʡ GROUP BY 9ô

 ВЫБЕРИТЕ клиента, СУММУ (OrderPrice) ОТ заказов 
Заказчик сум (OrderPrice)
куста 5700
Картер 5700
куста 5700
куста 5700
Адамс 5700
Картер 5700

ĽҪġ

ВЫБРАТЬ أ £ ВЫБРАТЬ ָ Сумма клиента (OrderPrice) СУММА (OrderPrice) "ֵ Order" OrderPrice "е ܼ ƣ" Клиент "6 Ӧ ÿ ֵ Ӧ" Заказы "eÿһUˣǵòȷĽѾˣGROUP BY ⡣

GROUP BY һϵ

һϵӦ Զ һϵӦ GROUP BY 䣬

ВЫБЕРИТЕ клиента, OrderDate, SUM (OrderPrice) из заказов
GROUP BY Клиент, OrderDate
 
,

Отправить ответ

avatar
  Подписаться  
Уведомление о