Sql group by

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

Операция GROUPING SETS позволяет распределять множество наборов столбцов по группам при вычислении агрегатных показателей вроде сумм. Ниже приведен пример, демонстрирующий применение этой операции для вычисления агрегатных показателей с их последующим распределением по трем таким группам: (year, region, item), (year, item) и (region, item). Операция GROUPING SETS устраняет необходимость в использовании неэффективных операций UNION ALL. 

SQL> SELECT year, region, item, sum(sales) FROM regional_salesitem GROUP BY GROUPING SETS (( year, region, item), (year, item), (region, item));

SQL операторы AND, OR и BETWEEN

Эти операторы позволяют сделать запрос еще более конкретным, добавив дополнительные критерии в оператор WHERE.

Оператор AND принимает два условия, и оба они должны быть истинными, чтобы строка отображалась в результате.

 Оператор OR принимает два условия, и любое из них должно быть истинным, чтобы строка отображалась в результате.

Оператор BETWEEN отфильтровывает определенный диапазон чисел или текста.

Мы также можем использовать эти операторы в сочетании друг с другом.

Скажем, наша таблица теперь такая:

employee_id first_name last_name email country salary
1 Timmy Jones [email protected] USA 2500.00
2 Kelly Smith [email protected] UK 1300.00
3 Jim White [email protected] UK 1200.76
4 José Luis Martìnez [email protected] Mexico 1275.87
5 Emilia Fischer [email protected] Germany 2365.90
6 Delphine Lavigne [email protected] France 2108.00
7 Louis Meyer [email protected] Germany 2145.70

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

Мы получили бы такой вывод:

 Это выбирает все поля, у строк которых есть employee_id от 3 до 7 и указана страна Germany.

SQL Оператор ORDER BY

Оператор ORDER BY сортирует по столбцам, упомянутым в операторе SELECT.

Он сортирует результаты и представляет их в алфавитном или числовом порядке по убыванию или возрастанию (по умолчанию — по возрастанию).

Мы можем указать направление сортировки с помощью команды: ORDER BY имя_столбца DESC | ASC.

В приведенном выше примере мы сортируем зарплаты сотрудников в команде инженеров и представляем их в порядке убывания числового значения.

Ordering Grouping Results

Groups aren’t returned in sorted order. In order to do this, you need to include the ORDER BY clause. Add the ORDER BY clause to the end of the SQL statement.

Modify this statement so it sorts the groups by SalesOrderID and CarrierTrackingNumber.

/*modify this statement*/
SELECT SalesOrderID, CarrierTrackingNumber, COUNT(1) as NumberofLines
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber;

/* Answer */
SELECT SalesOrderID, CarrierTrackingNumber, COUNT(1) as NumberofLines 
FROM Sales.SalesOrderDetail 
GROUP BY SalesOrderID, CarrierTrackingNumber 
ORDER BY SalesOrderID, CarrierTrackingNumber 

SQL GROUP BY Statement | Aggregate Functions

Aggregate functions are functions that take a set of rows as input and return a single value. In SQL we have five aggregate functions which are also called multirow functions as follows.

Advertisement

  • : Returns the sum or total of each group.
  • : Returns the number of rows of each group.
  • : Returns the average and mean of each group.
  • : Returns the minimum value of each group.
  • : Returns the minimum value of each group.

For examples of SQL GROUP BY Statement, here we are considering some tables of school management systems:

The Records of above tables are as follow:Student Table

student_id studentname admissionno admissiondate enrollmentno date_of_birth email city class_id
101 reema 10001 02-02-2000 e15200002 02-02-1990 [email protected] surat 2
102 kriya 10002 04-05-2001 e16200003 04-08-1991 [email protected] surat 1
103 meena 10003 06-05-1999 e15200004 02-09-1989 [email protected] vadodara 3
104 carlin 2001 04-01-1998 e14200001 04-04-1989 [email protected] vapi 1
105 dhiren 2002 02-02-1997 e13400002 02-02-1987 [email protected] vapi 2
106 hiren 2003 01-01-1997 e13400001 03-03-1887 [email protected] surat 2
107 mahir 10004 06-09-2000 e15200003 07-09-1990 [email protected] vapi 3
108 nishi 2004 02-04-2001 e16200001 03-02-1991 [email protected] vadodara 1

Result Table

result_id student_id examname examdate subject obtainmark totalmarks percentage grade status
3001 101 sem1 07-08-2001 1 80 100 80 A+ pass
3002 101 sem1 08-08-2001 2 76 100 76 A+ pass
3003 102 sem3 05-05-2000 3 67 100 67 A pass
3004 102 sem3 06-05-2000 4 89 100 89 A+ pass
3005 102 sem3 07-05-2000 5 90 100 90 A+ pass
3006 103 sem5 08-09-1998 6 55 100 55 B pass
3007 103 sem5 09-09-1998 7 30 100 30 D fail
3008 103 sem5 10-09-1998 8 34 100 34 D fail

Subject Table

subjectid facultyname subjectname subjectcode
1 krishna c 1003
2 rahul cpp 1004
3 radha asp 1005
4 meera sql 1006
5 yasoda cloud 1007
6 nadan cg 1008

What Is The SQL GROUP BY Clause?

The GROUP BY clause is a clause in the SELECT statement. It allows you to create groups of rows that have the same value when using some functions (such as SUM, COUNT, MAX, MIN, and AVG).

Aggregate functions without a GROUP BY will return a single value.

If you want to find the aggregate value for each value of X, you can GROUP BY x to find it.

It allows you to find the answers to problems such as:

  • The total number of sales per month
  • The average salary of an employee per department
  • The number of students enrolled per year

It goes towards the end of your SELECT query.

The SELECT statement could look like this:

It allows you to write queries like “select * from table group by column”.

The GROUP BY clause in the query is what we will be discussing in this article. We’ll also cover the HAVING clause as they are closely related.

Взаимосвязь PHP и MySQL

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

С аналогичной легкостью решаются задачи поиска в рамках сайта, разбиения на страницы, регистрации и авторизации пользователей. Несмотря на значительнее количество базовых систем, на основе которых могут быть сформированы веб-приложения, MySQL остается наиболее предпочтительной. Поддержка сервера MySQL составляет стандартный комплект поставки PHP. Поэтому связка PHP+MySQL воспринимается как неразрывная.

Подробнее

Предложение используется для определения групп выходных строк, к которым могут применяться агрегатные функции (, , , и ). Если это предложение отсутствует, и используются агрегатные функции, то все столбцы с именами, упомянутыми в , должны быть включены в агрегатные функции, и эти функции будут применяться ко всему набору строк, что удовлетворяют предикату запроса. В противном случае все столбцы списка , не вошедшие в агрегатные функции, должны быть указаны в предложении . В результате чего все выходные строки запроса разбиваются на группы, характеризуемые одинаковыми комбинациями значений в этих столбцах. После чего к каждой группе будут применены агрегатные функции. Для все значения трактуются как равные, т.е. при группировке по полю, содержащему -значения, все такие строки попадут в одну группу.

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

Пример:

SELECT model, COUNT(model) AS Qty_model, AVG(price) AS Avg_price
FROM PC
GROUP BY model;

В этом запросе для каждой модели ПК определяется их количество и средняя стоимость. Все строки с одинаковыми значениями model (номер модели) образуют группу, и на выходе вычисляются кол-во значений и средняя цена для каждой группы. Результатом выполнения запроса будет следующая таблица:

model Qty_model Avg_price
1121 3 850
1232 4 425
1233 3 843,333333333333
1260 1 350

Если бы в присутствовал столбец с датой, то можно было бы вычислять эти показатели для каждой конкретной даты. Для этого нужно добавить дату в качестве группирующего столбца, и тогда агрегатные функции вычислялись бы для каждой комбинации значений {модель, дата}.

Существует несколько определенных правил выполнения агрегатных функций.

  • Если в результате выполнения запроса не получено ни одной строки (или ни одной строки для данной группы), то исходные данные для вычисления любой из агрегатных функций отсутствуют. В этом случае результатом выполнения функций будет нуль, а результатом всех других функций — .Данное свойство может дать не всегда очевидный результат. Рассмотрим, например, такой запрос:

    1. a
    2. price
    3. PC
    4. price<
    select 1 a where
    exists(select MAX(price)
             from PC 
             where price<0)
    
  • Подзапрос в предикате EXISTS возвращает одну строку с NULL в качестве значения столбца. Поэтому, несмотря на то, что ПК с отрицательными ценами нет в базе данных, запрос в примере вернет 1.
  • Аргумент агрегатной функции не может сам содержать агрегатные функции (функция от функции). То есть в простом запросе (без подзапросов) нельзя, скажем, получить максимум средних значений.
  • Результат выполнения функции есть целое число (INTEGER). Другие агрегатные функции наследуют типы данных обрабатываемых значений.
  • Если при выполнении функции будет получен результат, превышающий максимально возможное значение для используемого типа данных, возникает ошибка.

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

Aggregations (COUNT, SUM, AVG)

Once we’ve decided how to group our data, we can then perform aggregations on the remaining columns.

These are things like counting the number of rows per group, summing a particular value across the group, or averaging information within the group.

To start, let’s find the number of sales per location.

Since each record in our table is one sale, the number of sales per location would be the number of rows within each location group.

To do this we’ll use the aggregate function to count the number of rows within each group:

We use which counts all of the input rows for a group.

( also works with expressions, but it has slightly different behavior.)

Here’s how the database executes this query:

  • — First, retrieve all of the records from the table
  • — Next, determine the unique groups
  • — Finally, select the location name and the count of the number of rows in that group

We also give this count of rows an alias using to make the output more readable. It looks like this:

The 1st Street location has two sales, HQ has four, and Downtown has two.

Here we can see how we’ve taken the remaining column data from our eight independent rows and distilled them into useful summary information for each location: the number of sales.

In a similar way, instead of counting the number of rows in a group, we could sum information within the group—like the total amount of money earned from those locations.

To do this we’ll use the function:

Instead of counting the number of rows in each group we sum the dollar amount of each sale, and this shows us the total revenue per location:

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

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

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

SELECT столбцы
FROM таблица




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

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

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

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

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). В конце группы сортируются по количеству товаров по убыванию.

НазадВперед

Next Steps

Data aggregation or summarization is one of the most important tasks and skills for anyone who manages data. From profit and loss statements to creating a perfect visualization of data, SQL Group By is the tool that allows us to do these kinds of tasks efficiently.

Now that you know how to aggregate and summarize data, it is time for you to start querying, manipulating, and visualizing all kinds of data to move forward in your journey to become an expert in SQL. If you liked this article and want to get certified, check out our Business Analyst Master’s Program as it will help you learn the A-Z of SQL as well.

Do you have any questions for us? Please mention them in the comment section of our “How to Aggregate Data Using Group By in SQL” article, and we’ll have our experts in the field answer them for you right away!

Функция SQL SUM

Функция SQL SUM возвращает сумму значений столбца таблицы базы данных. Она может применяться только
к столбцам, значениями которых являются числа. Запросы SQL для получения результирующей суммы
начинаются так:

SELECT SUM
(ИМЯ_СТОЛБЦА) …

После этого выражения следует FROM (ИМЯ_ТАБЛИЦЫ), а далее с помощью конструкции WHERE может быть
задано условие. Кроме того, перед именем столбца может быть указано DISTINCT, и это означает, что
учитываться будут только уникальные значения. По умолчанию же учитываются все значения (для этого
можно особо указать не DISTINCT, а ALL, но слово ALL не является обязательным).

Пример 1.
Есть база данных фирмы с данными о её подразделениях
и сотрудниках. Таблица Staff помимо всего имеет столбец с данными о заработной плате сотрудников. Выборка
из таблицы имеет следующий вид (для увеличения картинки щёлкнуть по ней левой кнопкой мыши):

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

SELECT SUM
(Salary)
FROM
Staff

Этот запрос вернёт значение 287664,63.

А теперь . В упражнениях уже начинаем
усложнять задания, приближая их к тем, что встречаются на практике.

Пример — две таблицы в операторе 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 в обеих таблицах.

USING ORDER BY

The function of the statement is to sort results in ascending or descending order based on the column(s) you specify in the query. Depending on the data type stored by the column you specify after it, will organize them in alphabetical or numerical order. By default, will sort results in ascending order; if you prefer descending order, however, you have to include the keyword in your query. You can also use the statement with , but it must come after in order to function properly. Similar to , must also come after the statement and clause. The general syntax for using is as follows:

ORDER BY syntax

Let’s continue with the sample data for the movie theater and practice sorting results with . Begin with the following query which retrieves values from the column and organizes those numerical values with an statement:

Since your query specified a column with numerical values, the statement organized the results by numerical and ascending order, starting with 25 under the column.

If you preferred to order the column in descending order, you would add the keyword at the end of the query. Additionally, if you wanted to order the data by the character values under , you would specify that in your query. Let’s perform that type of query using to order the column with character values in descending order. Sort the results even further by including a clause to retrieve the data on movies showing at 10:00 pm from the column:

This result set lists the four different movie showings at 10:00 pm in descending alphabetical order, starting from Top Gun Maverick to Downtown Abbey A New Era.

For this next query, combine the and statements with the aggregate function to generate results on the total revenue received for each movie. However, let’s say the movie theater miscounted the total guests and forgot to include special parties that had pre-purchased and reserved tickets for a group of 12 people at each showing.

In this query use and include the additional 12 guests at each movie showing by implementing the operator for addition and then adding to the . Make sure to enclose this in parenthesis. Then, multiply this total by the with the operator , and complete the mathematical equation by closing the parenthesis at the end. Add the clause to create the alias for the new column titled . Then, use to group results for each movie based on the data retrieved from the column. Lastly, use to organize the results under the new column in ascending order:

This result set tells us the total revenue for each movie with the additional 12 guest ticket sales and organizes the total ticket sales in ascending order from lowest to highest. From this, we learn that Top Gun Maverick received the most ticket sales, while Men received the least. Meanwhile, The Bad Guys and Downton Abbey A New Era movies were very close in total ticket sales.

In this section, you practiced various ways to implement the statement and how to specify the order you prefer, such as ascending and descending orders for both character and numerical data values. You also learned how to include the clause to narrow down your results, and performed a query using both the and statements with an aggregate function and mathematical equation.

The SQL Server GROUP BY Clause

SELECT       column_name , group_function(column_name)
FROM         table_name
WHERE        condition
GROUP BY     column_name

So far, each group function described here has treated the table as one large group of data. In most cases you need to divide the table into smaller groups, instead of getting the average salary of all employees in Employees table, you would rather see, for example, the average salary grouped by each department (what is the average salary of the HR department, IT department and so on).

You can use the SQL Server GROUP BY clause to divide the rows in a table into groups. Then you can use the group functions to retrieve summary information for each group.

SELECT      department_id , AVG(salary)
FROM        employees
GROUP BY    department_id
Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Вадлейд
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: