Команда union

Что такое оператор GROUP BY

GROUP BY – это оператор (или конструкция, кому как удобней) SQL для группировки данных по полю, при использовании в запросе агрегатных функций, таких как sum, max, min, count и других.

Как Вы знаете, агрегатные функции работают с набором значений, например sum суммирует все значения. А вот допустим, Вам необходимо просуммировать по какому-то условию или сразу по нескольким условиям, именно для этого нам нужен оператор group by, чтобы сгруппировать все данные по полям с выводом результатов агрегатных функций.

Как мне кажется, наглядней будет это все разобрать на примерах, поэтому давайте перейдем к примерам.

The GROUP BY clause: MySQL vs. standard SQL

Standard SQL does not allow you to use an alias in the clause, however, MySQL supports this.

For example, the following query extracts the year from the order date. It first uses as an alias of the expression and then uses the alias in the clause. This query is not valid in standard SQL.

MySQL also allows you to sort the groups in ascending or descending orders while the standard SQL does not. The default order is ascending. For example, if you want to get the number of orders by status and sort the status in descending order, you can use the clause with as the following query:

Notice that we used  in the clause to sort the in descending order. We could also specify explicitly  in the clause to sort the groups by status in ascending order.

In this tutorial, we have shown you how to use the MySQL clause to group rows into subgroups based on values of columns or expressions.

  • Was this tutorial helpful?

Пример — использование SQL GROUP BY

В некоторых случаях вам потребуется использовать предложение SQL GROUP BY с функцией AVG. Например, вы также можете использовать функцию AVG, чтобы вернуть название отдела и средние продажи (в связанном отделе).

PgSQL

SELECT department,
AVG(sales) AS «Average Sales»
FROM order_details
WHERE department > 10
GROUP BY department;

1
2
3
4
5

SELECTdepartment,

AVG(sales)AS»Average Sales»

FROMorder_details

WHEREdepartment>10

GROUP BYdepartment;

Поскольку в операторе SELECT вы указали один столбец, который не инкапсулирован в функции AVG, вы должны использовать предложение GROUP BY, поэтому поле department должно быть указано в разделе GROUP BY.

Раздел GROUP BY

Если в табличном выражении присутствует раздел GROUP BY SQL, то следующим выполняется GROUP BY.

Если обозначить через R таблицу, являющуюся результатом предыдущего раздела (FROM или WHERE), то результатом раздела GROUP BY является разбиение R на множество групп строк, состоящего из минимального числа групп таких, что для каждого столбца из списка столбцов раздела GROUP BY во всех строках каждой группы, включающей более одной строки, значения этого столбца равны. Для обозначения результата раздела GROUP BY в стандарте используется термин “сгруппированная таблица”.

Если утверждение SELECT содержит предложение GROUP BY(SELECT GROUP BY), список выбора может содержать только следующие типы выражений:

  • Константы.
  • Агрегатные функции.
  • Функции USER, UID, и SYSDATE.
  • Выражения, соответствующие перечисленным в предложении GROUP BY.
  • Выражения, включающие вышеперечисленные выражения.

Пример 1. Вычислить общий объем покупок для каждого товара:

Фраза GROUP BY не предполагает упорядочивания строк. Для упорядочивания результата этого примера по кодам товаров, следует поместить фразу  ORDER BY stock следом за фразой GROUP BY.

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

Строки, не удовлетворяющие условию WHERE, исключаются перед группированием данных.

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

Допустим, есть задача на вычисление количества какого-либо продукта. Поставщик поставляет нам продукцию по определённой цене. Вычислим общее количество каждого из продуктов. В этом нам поможет фраза GROUP BY. Результатом задачи станет таблица, состоящая из нескольких колонок. Поставки будут группироваться по ПР. Компоновка происходит по группам, которую и инициирует Group By SQL. Необходимо отметить, что данная фраза предполагает применение фразы Select, она же в свою очередь определяет единственное значение для каждого выражения сформированной группы. Бывают три случая для конкретного выражения: оно принимает арифметическое значение, оно становится SQL-функцией, которая будет сводить все значения столбца к сумме или другому заданному значению, также выражение может стать константой. Строки таблицы не обязательно должны быть строго сгруппированы, они могут группироваться по любой комбинации столбцов таблицы. Необходимо учитывать, что упорядочивание запросы по ПР возможно в том случае, если будет сделан соответствующий запрос.

Синтаксис

Синтаксис для функции AVG в SQL.

SELECT AVG(aggregate_expression) FROM tables ;

Или синтаксис для функции AVG при группировке результатов по одному или нескольким столбцам.

SELECT expression1, expression2, … expression_n, AVG(aggregate_expression) FROM tables GROUP BY expression1, expression2, … expression_n;

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

expression1, expression2, … expression_n
Выражения, которые не инкапсулированы в функции AVG и должны быть включены в предложение GROUP BY в конце SQL запроса
aggregate_expression
Это столбец или выражение, которое будет усреднено
tables
Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица
WHERE conditions
Необязательный. Это условия, которые должны быть выполнены для выбора записей

Пример — две таблицы в операторе FROM (INNER JOIN)

Давайте посмотрим, как использовать предложение FROM, чтобы INNER JOIN (объединить) вместе две таблицы.

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

product_id product_name category_id
1 Pear 50
2 Banana 50
3 Orange 50
4 Apple 50
5 Bread 75
6 Sliced Ham 25
7 Kleenex NULL

И таблица categories со следующими данными:

category_id category_name
25 Deli
50 Produce
75 Bakery
100 General Merchandise
125 Technology

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

PgSQL

SELECT products.product_name, categories.category_name
FROM products
INNER JOIN categories
ON products.category_id = categories.category_id
WHERE product_name <> ‘Pear’;

1
2
3
4
5

SELECTproducts.product_name,categories.category_name

FROMproducts

INNER JOINcategories

ONproducts.category_id=categories.category_id

WHEREproduct_name<>’Pear’;

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

product_name category_name
Banana Produce
Orange Produce
Apple Produce
Bread Bakery
Sliced Ham Deli

В этом примере оператора FROM используется объединение двух таблиц — products и categories. В этом случае мы используем FROM, чтобы указать INNER JOIN между таблицами products и categories на основе столбца category_id в обеих таблицах.

Использование конструкции GROUP BY с операцией HAVING

Операция позволяет ограничивать или исключать результаты операции , т.е., по сути, накладывать на результирующий набор условие . В следующем примере операция ограничивает результаты запроса только теми отделами, в которых максимальная зарплата превышает 20 000:

SQL> SELECT department_id, max(salary)
2 FROM employees
3 GROUP BY department_id
4* HAVING MAX(salary)>20000;
DEPARTMENT_ID  MAX(SALARY)
-------------  -----------
    90         24000
SQL>

Вас заинтересует / Intresting for you:

Oracle и Java: использование P… 2875 просмотров sepia Tue, 08 May 2018, 08:52:34

Значения NULL в PL/SQL Oracle 2510 просмотров Дэн Wed, 01 Jul 2020, 08:10:56

Язык SQL и PL/SQL Oracle 2039 просмотров Андрей Волков Tue, 21 Nov 2017, 13:17:28

Oracle IDE: JDeveloper, SQL De… 2664 просмотров Ольга Потемкина Tue, 21 Nov 2017, 13:18:46

Author: Aida

Другие статьи автора:

Заключение

Для более глубокого изучения ORM и GROUP BY, просмотрите следующие ссылки:

  • How to use grouping sets in Django: Статья о продвинутой группировке по таким техникам, как группировка по cube, группировка по rollup и группировка по grouping sets.
  • How to Get the First or Last Value in a Group Using Group By in SQL: Небольшая хитрость с использованием массивов в PostgreSQL.
  • 12 Common Mistakes and Missed Optimization Opportunities in SQL: 12 распространенных ошибок и упущенных возможностей оптимизации в SQL.
  • : Документация по общим запросам аггрегации.

Оригинальная статья: Understand Group by in Django with SQL

Spread the love

Подведем итоги

Конструкция/Блок Порядок выполнения Выполняемая функция
SELECT возвращаемые выражения 4 Возврат данных полученных запросом
FROM источник В нашем случае это пока все строки таблицы
WHERE условие выборки из источника 1 Отбираются только строки, проходящие по условию
GROUP BY выражения группировки 2 Создание групп по указанному выражению группировки. Расчет агрегированных значений по этим группам, используемых в SELECT либо HAVING блоках
HAVING фильтр по сгруппированным данным 3 Фильтрация, накладываемая на сгруппированные данные
ORDER BY выражение сортировки результата 5 Сортировка данных по указанному выражению
SalaryAmount
5000
SalaryAmount
2000
2500
5000
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *