Group sql: GROUP BY | SQL | SQL-tutorial.ru

Содержание

Команда 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

Команда HAVING — условие для GROUP BY

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

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

Синтаксис

GROUP BY поле HAVING условие

Примеры

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

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

Пример

В данном примере демонстрируется работа GROUP BY без условия HAVING:

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

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

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

А теперь с помощью условия HAVING оставим только те строки, в которых суммарная зарплата больше или равна 1000:

SELECT age, SUM(salary) as sum FROM workers GROUP BY age HAVING sum>=1000

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

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

Пример

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

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

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

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

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

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

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

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

Аналогичного эффекта можно достигнуть, если воспользоваться командой IN:

SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count IN(1,2)

Можно также использовать команду BETWEEN:

SELECT age, COUNT(*) as count FROM workers GROUP BY age HAVING count BETWEEN 1 AND 2

Как вы видите, в HAVING допустимы все команды, используемые в условии WHERE.

Функция COUNT — подсчет количества записей

Функция COUNT подсчитывает количество записей в таблице.

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

Команда WHERE не является обязательной, если ее не указать — будут подсчитаны все записи в таблице.

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

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

Синтаксис

Подсчет всех записей:

SELECT COUNT(*) FROM имя_таблицы WHERE условие

Подсчет всех записей, где заданное поле не равно NULL:

SELECT COUNT(поле) FROM имя_таблицы WHERE условие

Только уникальные значения поля:

SELECT COUNT(DISTINCT поле) FROM имя_таблицы WHERE условие

Примеры

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

id
айди
name
имя
age
возраст
salary
зарплата
1Дима23400
2Петя25500
3Вася23500
4Коля301000
5Иван27500
6Кирилл281000

Пример

Давайте подсчитаем всех работников с возрастом 23 года:

SELECT COUNT(*) as count FROM workers WHERE age=23

Результат выполнения SQL запроса:

count
результат подсчета
2

Пример

Давайте подсчитаем количество разных зарплат (их будет 3 штуки: 400, 500 и 1000):

SELECT COUNT(DISTINCT salary) as count FROM workers

Результат выполнения SQL запроса:

count
результат подсчета
3

Пример

Давайте подсчитаем одновременно количество разных возрастов и количество разных зарплат:

SELECT
	COUNT(DISTINCT age) as count1,
	COUNT(DISTINCT salary) as count2
FROM workers

Результат выполнения SQL запроса:

count1
количество возрастов
count2
количество зарплат
53

Меняем таблицу для примеров

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

id
айди
name
имя
age
возраст
salary
зарплата
1Дима23NULL
2Петя25500
3Вася23NULL

Пример

Давайте подсчитаем количество всех записей:

SELECT COUNT(*) as count FROM workers

Результат выполнения SQL запроса:

count
результат подсчета
3

А теперь подсчитаем количество зарплат, не равных NULL:

SELECT COUNT(salary) as count FROM workers

Результат выполнения SQL запроса:

count
результат подсчета
1

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 пункт «GROUP BY 1»?



Кто-то прислал мне запрос SQL, где предложение GROUP BY состояло из утверждения: GROUP BY 1 .

Это, должно быть, опечатка, верно? Ни один столбец не имеет псевдонима 1. Что это может означать? Правильно ли я предполагаю, что это должно быть опечатка?

mysql sql group-by
Поделиться Источник Spencer     12 сентября 2011 в 19:10

6 ответов


  • что это значит, когда мы используем «group by 1» в запросе SQL

    Я наткнулся на запрос, где он указан select concat(21*floor(diff/21), ‘-‘, 21*floor(diff/21) + 20) as `range`, count(*) as `number of users` from new_table group by 1 order by diff; вот что именно означает group by 1 ?

  • «group by» требуется в операторе count(*) SQL?

    Следующее утверждение работает в моей базе данных: select column_a, count(*) from my_schema.my_table group by 1; но это не так: select column_a, count(*) from my_schema.my_table; Я получаю ошибку: ERROR: столбец my_table. 1 2 FROM account GROUP BY 1;

    В приведенном выше запросе GROUP BY 1 относится к first column in select statement , который является account_id .

    Вы также можете указать в ORDER BY .

    Примечание : Число по ПОРЯДКУ и GROUP BY всегда начинается с 1, а не с 0.

    Поделиться Vishwanath Dalvi     12 сентября 2011 в 19:18



    28

    В дополнение к группировке по имени поля вы также можете указать порядковый номер или положение поля в таблице. 1 соответствует первому полю (независимо от имени), 2-второму и так далее.

    Это, как правило, не рекомендуется, если вы группируетесь по чему-то конкретному, так как структура таблицы/представления может измениться. Кроме того, может быть трудно быстро понять, что делает ваш запрос SQL, если вы не запомнили поля таблицы.

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

    Поделиться vol7ron     12 сентября 2011 в 19:19



    14

    Это будет group by первое поле в предложении select

    Поделиться Daan Geurts     12 сентября 2011 в 19:13



    5

    Это означает sql group by 1-й столбец в вашем предложении select, мы всегда используем этот GROUP BY 1 вместе с ORDER BY 1 , кроме того , вы также можете использовать этот GROUP BY 1,2,3.., конечно, это удобно для нас, но вам нужно обратить внимание на это условие, результат может быть не тем, что вы хотите, если кто-то изменил ваши столбцы select, и он не визуализируется

    Поделиться 张艳军     15 мая 2017 в 08:23



    4

    Это будет group by позиция столбца, которую вы ставите после предложения group by.

    например, если вы запустите «SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1» , это будет group by SALESMAN_NAME .

    Один из рисков при этом заключается в том, что если вы запустите » Select * » и по какой-то причине воссоздадите таблицу со столбцами в другом порядке, это даст вам другой результат, чем вы ожидали.

    Поделиться wdoering     19 декабря 2014 в 18:32


    Похожие вопросы:


    SQL Оптимизировать Group By Запрос

    У меня здесь есть таблица со следующими полями: Удостоверение личности, имя, вид. дата Данные: id name kind date 1 Thomas 1 2015-01-01 2 Thomas 1 2015-01-01 3 Thomas 2 2014-01-01 4 Kevin 2…


    Является ли предложение GROUP BY в SQL избыточным?

    Всякий раз, когда мы используем агрегатную функцию в SQL ( MIN , MAX , AVG и т. д.), Мы всегда должны GROUP BY все неагрегированные столбцы, например: SELECT storeid, storename, SUM(revenue),…


    GROUP BY с Максом (дата)

    Например , я пытаюсь перечислить последний пункт назначения (время отправления MAX) для каждого поезда в таблице : Train Dest Time 1 HK 10:00 1 SH 12:00 1 SZ 14:00 2 HK 13:00 2 SH 09:00 2 SZ 07:00…


    что это значит, когда мы используем «group by 1» в запросе SQL

    Я наткнулся на запрос, где он указан select concat(21*floor(diff/21), ‘-‘, 21*floor(diff/21) + 20) as `range`, count(*) as `number of users` from new_table group by 1 order by diff; вот что именно…


    «group by» требуется в операторе count(*) SQL?

    Следующее утверждение работает в моей базе данных: select column_a, count(*) from my_schema.my_table group by 1; но это не так: select column_a, count(*) from my_schema.my_table; Я получаю ошибку:…


    SQL «Distinct» и Group By пункт

    ищу по всему этому сайту, но не вижу никакой похожей и помогающей темы. Пример: у меня есть данные, как показано ниже Col1 Col2 aaaa 1111 aaaa 2222 bbbb 4444 bbbb 3333 Как я могу запросить таблицу,…


    SQL использование GROUP BY и COUNT

    Я создал таблицу MariaDB(10.1.21) с именем ‘group_test’ и сохранил некоторые данные, как показано ниже. Group Item Value1 Value2 Value3 A a1 1 0 0 A a2 1 1 1 A a3 1 1 2 B b1 1 1 0 B b2 1 1 1 B b3 1…


    SQL GROUP BY 1 2 3 и SQL порядок исполнения

    Это может быть глупый вопрос, но я действительно запутался. Таким образом, в соответствии с порядком выполнения запроса SQL предложение GROUP BY будет выполнено до предложения SELECT . Однако это…


    SQL — GROUP BY пункт

    У меня есть таблица, в которой мне нужны были последние 2 строки из каждого type записей. используя GROUP BY . Например, на рисунке ниже я хочу получить последние 2 записи в зависимости от столбца…


    SQL SELECT — GROUP BY

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

    разница между PARTITION BY и GROUP BY

    Мы можем взять простой пример.

    Рассмотрим таблицу с именами TableAсо следующими значениями:

    id  firstname                   lastname                    Mark
    -------------------------------------------------------------------
    1   arun                        prasanth                    40
    2   ann                         antony                      45
    3   sruthy                      abc                         41
    6   new                         abc                         47
    1   arun                        prasanth                    45
    1   arun                        prasanth                    49
    2   ann                         antony                      49

    GROUP BY

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

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

    Синтаксис:

    SELECT expression1, expression2, ... expression_n, 
           aggregate_function (aggregate_expression)
    FROM tables
    WHERE conditions
    GROUP BY expression1, expression2, ... expression_n;

    Мы можем применить GROUP BYв нашей таблице:

    select SUM(Mark)marksum,firstname from TableA
    group by id,firstName

    Результаты:

    marksum  firstname
    ----------------
    94      ann                      
    134     arun                     
    47      new                      
    41      sruthy   

    В нашей реальной таблице у нас есть 7 строк, и когда мы применяем GROUP BY id, сервер группирует результаты на основе id:

    Простыми словами:

    здесь GROUP BYобычно уменьшается количество возвращаемых строк путем их сворачивания и вычисления Sum()для каждой строки.

    PARTITION BY

    Прежде чем перейти к PARTITION BY, давайте посмотрим на OVERпредложение:

    Согласно определению MSDN:

    Предложение OVER определяет окно или заданный пользователем набор строк в наборе результатов запроса. Затем оконная функция вычисляет значение для каждой строки в окне. Вы можете использовать предложение OVER с функциями для вычисления агрегированных значений, таких как скользящие средние, кумулятивные агрегаты, промежуточные итоги или максимальный N для каждой группы результатов.

    PARTITION BY не уменьшит количество возвращаемых строк.

    Мы можем применить PARTITION BY в нашем примере таблицы:

    SELECT SUM(Mark) OVER (PARTITION BY id) AS marksum, firstname FROM TableA

    Результат:

    marksum firstname 
    -------------------
    134     arun                     
    134     arun                     
    134     arun                     
    94      ann                      
    94      ann                      
    41      sruthy                   
    47      new  

    Посмотрите на результаты — он разделит строки и вернет все строки, в отличие от GROUP BY.

    Команда SELECT Раздел 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. Вычислить общий объем покупок для каждого товара:

    SELECT stock,  SUM(quant)   FROM ordsale GROUP BY stock;

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

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

    SELECT stock,  SUM(quant)   FROM ordsale WHERE customerno<>23 GROUP BY stock;

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

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

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

    SQL | GROUP BY — GeeksforGeeks

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

    Важные моменты:

    • Предложение GROUP BY используется с оператором SELECT.
    • В запросе предложение GROUP BY помещается после предложения WHERE.
    • В запросе предложение GROUP BY помещается перед предложением ORDER BY, если оно используется.

    Синтаксис :

     ВЫБРАТЬ столбец1, имя_функции (столбец2)
    FROM table_name
    ГДЕ условие
    ГРУППА ПО столбцу 1, столбцу 2
    ЗАКАЗАТЬ столбец1, столбец2;
    
      имя_функции : имя используемой функции, например SUM (), AVG ().
      имя_таблицы : Имя таблицы.
      состояние : Состояние использованное.
     

    Пример таблицы:

    Сотрудник


    Студент


    Пример:

    • Группировать по одному столбцу : Группировать по одному столбцу означает, чтобы разместить все строки с одинаковым значением только этот конкретный столбец в одной группе.Рассмотрим запрос, как показано ниже:
       ВЫБЕРИТЕ ИМЯ, СУММУ (ЗАРПЛАТА) ОТ сотрудника
      ГРУППА ПО ИМЕНИ;
       

      Вышеупомянутый запрос выдаст следующий результат:

      Как вы можете видеть в вышеприведенном выводе, строки с повторяющимися ИМЕНАМИ сгруппированы под тем же ИМЯ, а их соответствующая ЗАРПЛАТА является суммой ЗАРПЛАТЫ повторяющихся строк. Здесь для вычисления суммы используется функция SQL SUM ().

    • Группировать по нескольким столбцам : Группировать по нескольким столбцам, например, GROUP BY column1, column2 .Это означает размещение всех строк с одинаковыми значениями обоих столбцов column1 и column2 в одной группе. Рассмотрим следующий запрос:
       SELECT SUBJECT, YEAR, Count (*)
      ОТ Студента
      ГРУППА ПО ПРЕДМЕТАМ, ГОД;
       

      Выходные данные :

      Как вы можете видеть в выходных данных выше, учащиеся с одинаковыми ПРЕДМЕТАМИ и ГОДОМ помещаются в одну группу. И те, у кого один и тот же SUBJECT, но не YEAR, принадлежат к разным группам. Итак, здесь мы сгруппировали таблицу по двум или более чем одному столбцу.

    Пункт HAVING

    Мы знаем, что предложение WHERE используется для размещения условий в столбцах, но что, если мы хотим разместить условия в группах?

    Здесь используется условие HAVING. Мы можем использовать предложение HAVING для размещения условий, чтобы решить, какая группа будет частью окончательного набора результатов. Также мы не можем использовать агрегатные функции, такие как SUM (), COUNT () и т. Д., С предложением WHERE. Поэтому нам нужно использовать предложение HAVING, если мы хотим использовать любую из этих функций в условиях.

    Синтаксис :

     ВЫБРАТЬ столбец1, имя_функции (столбец2)
    FROM table_name
    ГДЕ условие
    ГРУППА ПО столбцу 1, столбцу 2
    ИМЕЮЩИЕ условие
    ЗАКАЗАТЬ столбец1, столбец2;
    
      имя_функции : имя используемой функции, например SUM (), AVG ().
      имя_таблицы : Имя таблицы.
      состояние : Состояние использованное.
     

    Пример :

     ВЫБЕРИТЕ ИМЯ, СУММУ (ЗАРПЛАТУ) ОТ сотрудника
    ГРУППА ПО ИМЕНИ
    ИМЕЕТ СУММУ (ЗАРПЛАТУ)> 3000;
     

    Выходные данные :

    Как видно из вышеприведенных выходных данных, в наборе результатов появляется только одна группа из трех, поскольку это единственная группа, в которой сумма SALARY больше 3000.Таким образом, мы использовали здесь предложение HAVING, чтобы разместить это условие, поскольку это условие требуется размещать в группах, а не в столбцах.

    Автор статьи: Harsh Agarwal . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на [email protected]. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

    Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или если вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.

    Вниманию читателя! Не прекращайте учиться сейчас. Изучите SQL для собеседований с помощью курса SQL от GeeksforGeeks.

    SQL Server GROUP BY

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

    Введение в SQL Server

    Предложение GROUP BY

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

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

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

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

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

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

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

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

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

    SQL Server

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

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

    Агрегатная функция выполняет вычисление для группы и возвращает уникальное значение для каждой группы. Например, COUNT () возвращает количество строк в каждой группе. Другие часто используемые агрегатные функции: СУММ () , СРЕД () (среднее), МИН () (минимум), МАКС () (максимум).

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

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

    Подробнее

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

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

    Использование предложения

    GROUP BY с примером функции COUNT ()

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

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

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

    Использование предложения

    GROUP BY с функциями MIN и MAX , пример

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

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

    Использование предложения

    GROUP BY с примером функции AVG ()

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

    Использование предложения

    GROUP BY с функцией SUM , пример

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

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

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

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

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

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

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

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

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

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

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

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

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

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

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

    Примеры SQL GROUP BY

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

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

     

    SELECT Department_id, COUNT (employee_id) штат ИЗ сотрудники ГРУППА ПО Department_id;

    Язык кода: SQL (язык структурированных запросов) (sql)

    Посмотреть в действии

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

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

    Посмотреть в действии

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

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

     

    ВЫБРАТЬ e.department_id, название отдела, COUNT (employee_id) штат ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ отделы д НА д.Department_id = e.department_id ГРУППА ПО e.department_id ЗАКАЗАТЬ ПО КОЛИЧЕСТВУ DESC;

    Язык кода: SQL (язык структурированных запросов) (sql)

    Посмотрите в действии

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

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

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

     

    SELECT е.Department_id, название отдела, COUNT (employee_id) штат ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ отделы d ON d.department_id = e.department_id ГРУППА ПО e.department_id ИМЕЮЩИЙ персонал> 5 ЗАКАЗАТЬ ПО КОЛИЧЕСТВУ DESC;

    Язык кода: SQL (язык структурированных запросов) (sql)

    Посмотреть в действии

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

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

    Посмотреть в действии

    SQL GROUP BY с примером функции СУММ

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

     

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

    Язык кода: SQL (язык структурированных запросов) (sql)

    Посмотреть в действии

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

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

     

    GROUP BY Department_id

    Язык кода: SQL (язык структурированных запросов) (sql)

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

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

     

    GROUP BY Department_id, job_id

    Язык кода: SQL (язык структурированных запросов) (sql)

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

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

     

    ВЫБРАТЬ e.department_id, название отдела, e.job_id, название работы, COUNT (идентификатор сотрудника) ИЗ сотрудники е ВНУТРЕННЕЕ СОЕДИНЕНИЕ отделы d ON d.department_id = e.department_id ВНУТРЕННЕЕ СОЕДИНЕНИЕ вакансии j ВКЛ j.job_id = e.job_id ГРУППА ПО e.department_id, e.job_id;

    Язык кода: SQL (язык структурированных запросов) (sql)

    Посмотреть в действии

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

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

    SQL GROUP BY и DISTINCT

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

    Следующее получает номера телефонов сотрудников, а также группирует строки по номерам телефонов.

     

    ВЫБРАТЬ номер телефона ИЗ сотрудники ГРУППА ПО номер телефона;

    Язык кода: SQL (язык структурированных запросов) (sql)

    Посмотреть в действии

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

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

     

    ВЫБРАТЬ ОТЛИЧИТЕЛЬНЫЙ номер телефона ИЗ сотрудники;

    Язык кода: SQL (язык структурированных запросов) (sql)

    Посмотреть в действии

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

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

    Было ли это руководство полезным?

    SQL ГРУППА ПО | Средний уровень SQL

    Начиная с этого места? Этот урок является частью полного руководства по использованию SQL для анализа данных. Проверьте начало.

    В этом уроке мы рассмотрим:

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

    Агрегатные функции SQL

    , такие как COUNT , AVG и SUM , имеют нечто общее: все они агрегируют по всей таблице. Но что, если вы хотите агрегировать только часть таблицы? Например, вы можете захотеть подсчитать количество записей за каждый год.

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

      ВЫБРАТЬ год,
           COUNT (*) AS count
      ИЗ tutorial.aapl_historical_stock_price
     ГРУППА ПО ГОДУ
      

    Вы можете группировать по нескольким столбцам, но вы должны разделять имена столбцов запятыми — как в случае с ORDER BY ):

      ВЫБРАТЬ год,
           месяц,
           COUNT (*) AS count
      ИЗ учебника.aapl_historical_stock_price
     ГРУППА ПО году, месяцу
      

    Практическая задача

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

    Попробуй это Посмотреть ответ

    GROUP BY номера столбцов

    Как и в случае с ORDER BY , вы можете заменить имена столбцов числами в предложении GROUP BY . Обычно рекомендуется делать это только тогда, когда вы группируете много столбцов или если что-то еще вызывает чрезмерно длинный текст в предложении GROUP BY :

      ВЫБРАТЬ год,
           месяц,
           COUNT (*) AS count
      ИЗ учебника.aapl_historical_stock_price
     ГРУППА ПО 1, 2
      

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

    Использование GROUP BY с ORDER BY

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

      ВЫБРАТЬ год,
           месяц,
           COUNT (*) AS count
      ИЗ tutorial.aapl_historical_stock_price
     ГРУППА ПО году, месяцу
     ЗАКАЗАТЬ ПО месяцу, году
      

    Использование GROUP BY с LIMIT

    При группировке по нескольким столбцам следует помнить об одном: SQL оценивает агрегаты до предложения LIMIT . Если вы не сгруппируете по столбцам, вы получите результат с одной строкой — никаких проблем.Если вы группируете столбец с достаточным количеством уникальных значений, превышающим число LIMIT , будут вычислены агрегаты, а затем некоторые строки будут просто исключены из результатов.

    На самом деле это хороший способ делать что-то, потому что вы знаете, что получите правильные агрегаты. Если SQL сокращает таблицу до 100 строк, а затем выполняет агрегирование, ваши результаты будут существенно другими. Результаты приведенного выше запроса превышают 100 строк, так что это прекрасный пример. Попробуйте снять ограничение и запустить его снова, чтобы увидеть, что изменится.

    Отточите свои навыки работы с SQL

    Практическая задача

    Напишите запрос для расчета среднесуточного изменения цен на акции Apple, сгруппированных по годам.

    Попробуй это Посмотреть ответ

    Практическая задача

    Напишите запрос, который вычисляет самые низкие и самые высокие цены, достигнутые акциями Apple за каждый месяц.

    Попробуй это Посмотреть ответ

    SQL GROUP BY — все, что вам нужно знать

    Блог

    A Краткое руководство

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

    Рассмотрим следующую таблицу:

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

      - Сколько стран на каждом континенте?
    Выбрать
      континент
      , считать(*)
    из
      страны
    группа по
      континент  

    Имейте в виду при использовании SQL GROUP BY:

    • Сгруппировать по X означает поместить всех с одинаковым значением X в одну строку.
    • Сгруппировать по X, Y поместите все те, у которых одинаковые значения для X и Y, в одну строку.

    Внедрение Analytics приостановлено; только встроенная аналитика может помочь

    Учить больше

    Еще интересные факты о SQL GROUP BY

    1. Агрегации могут быть отфильтрованы с помощью предложения HAVING

    Вы быстро обнаружите, что предложение where нельзя использовать для агрегирования. Например:

      выбрать
      континент
      , max (площадь)
    из
      страны
    куда
      max (площадь)> = 1e7
    группа по
      1  

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

    Используя имеющийся, вы можете вернуть совокупные отфильтрованные результаты!

    2. Часто можно группировать по номеру столбца

    Во многих базах данных вы можете группировать по номеру столбца, а также по имени столбца. Наш первый запрос можно было бы написать:

      выбрать
      континент
      , считать(*)
    из
      база
    группа по
      1  

    и вернул те же результаты.Это называется порядковым обозначением, и его использование обсуждается. Он появился раньше столбцовой нотации и был стандартом SQL до 1980-х годов.

    • Менее явный, что может ухудшить читаемость для некоторых пользователей.
    • Может быть более хрупким. Оператор выбора запроса может изменить имя столбца и продолжить выполнение, что приведет к неожиданному результату.

    С другой стороны, у него есть несколько преимуществ.

    • SQL-кодеры стремятся к последовательному шаблону выбора сначала измерений, а затем агрегатов.Это делает чтение SQL более предсказуемым.
    • С большими запросами проще работать. При написании длинных операторов ETL у меня были операторы группировки по многим-многим строкам. Мне было трудно поддерживать это.
    • Некоторые базы данных позволяют использовать столбец с псевдонимом в группе по. Это позволяет группировать длинный оператор case без повторения полного оператора в предложении group by. Использование порядковых позиций может быть более чистым и предотвратить непреднамеренную группировку по псевдониму, который соответствует имени столбца в базовых данных.Например, следующий запрос вернет правильные значения:
      - Сколько стран используют валюту, называемую долларом?
    Выбрать
      случай, когда валюта = "Доллар", тогда валюта
        else "Другое"
      конец как валюта - плохой псевдоним
      , считать(*)
    из
      страны
    группа по
      1  

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

      выбрать
      случай, когда валюта = "Доллар", тогда валюта
        else "Другое"
      конец как валюта - плохой псевдоним
      , считать(*)
    из
      страны
    группа по
      валюта  

    Это «ожидаемое» поведение, но будьте бдительны.

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

    3. Неявная GROUP BY

    Есть один случай, когда вы можете выполнить агрегирование без использования group by. Когда вы агрегируете полную таблицу, подразумевается группа SQL по. В документации по стандартам SQL это называется <общая сумма>.

      - Какой самый большой и средний размер страны в Европе?
    Выбрать
      max (площадь) как наибольшая_ страна
      , avg (площадь) как avg_country_area
    из
      страны
    куда
      континент = 'Европа'  

    4.GROUP BY рассматривает Null как группируемое значение, и это странно.

    Если ваш набор данных содержит несколько значений NULL, group by будет рассматривать их как одно значение и агрегировать для набора.

    Это не соответствует стандартному использованию null, который никогда не равен чему-либо, включая себя самого.

      выберите null = null
    - возвращает null, а не True  

    Из руководящих принципов стандартов SQL в SQL: 2008

    «Хотя нулевое значение не равно какому-либо другому значению и не равно какому-либо другому значению — неизвестно, равно ли оно какому-либо заданному значению — в некоторых контекстах несколько нулевых значений обрабатываются вместе; например, обрабатывает все нулевые значения вместе.”

    5. MySQL позволяет группировать по без указания всех неагрегированных столбцов

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

      выбрать
      страна
      , штат
      , считать(*)
    из
      страны
    группа по
      страна  

    На сегодня все! Группировать по — часто используемое ключевое слово, но, надеюсь, теперь у вас есть более четкое представление о некоторых из его более тонких применений.

    Принятие аналитики остановилось; только встроенная аналитика может помочь

    Учить больше

    SQL GROUP BY

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

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

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

    Предложение GROUP BY очень полезно, когда вы хотите анализировать данные аналитическим способом, например, продукты были куплены покупателем или проданы продавцом по кварталам. Поэтому предложение GROUP BY часто применяется в системах хранилищ данных и бизнес-аналитики (BI) для создания аналитических отчетов.

    Типичный синтаксис GROUP BY выглядит следующим образом:

     

    SELECT столбец1, столбец2, агрегатная функция (выражение) ИЗ table_name КУДА состояние GROUP BY column1;

    Примеры SQL GROUP BY

    Давайте посмотрим на продукты Таблица :

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

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

     

    SELECT categoryid, SUM (на складе) ИЗ продукты GROUP BY categoryid;

    Механизм базы данных выполняет следующие шаги:

    • Сначала проверяет предложение GROUP BY и делит продукты на группы на основе категории продукта categoryid .
    • Во-вторых, вычисляет общее количество единиц на складе с помощью функции СУММ для каждой группы.

    SQL GROUP BY с функцией COUNT, пример

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

     

    ВЫБРАТЬ categoryid, COUNT (productid) ИЗ продукты GROUP BY categoryid;

    SQL GROUP BY с функцией AVG

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

     

    SELECT categoryid, FLOOR (AVG (unitinstock)) ИЗ продукты GROUP BY categoryid;

    Функция FLOOR используется для получения наибольшего целочисленного значения, которое не превышает аргумент.

    SQL GROUP BY с функциями MIN и MAX

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

     

    SELECT categoryid, MIN (на складе), MAX (на складе) ИЗ продукты GROUP BY categoryid;

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

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

     

    SELECT categoryid, COUNT (productid) ИЗ продукты ГРУППА ПО идентификатору категории ORDER BY COUNT (productid) DESC;

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

    Вы можете сгруппировать набор результатов не только по одному столбцу, но и по нескольким столбцам.Например, если вы хотите узнать, сколько заказов на продажу было заказано покупателем и продано продавцом, вы можете сгруппировать набор результатов как по клиенту, так и по продавцу.

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

    Следующий запрос иллюстрирует идею:

     

    SELECT б. заказчик, b.CompanyName, COUNT (a.orderid) КАК "Заказы", CONCAT (e.lastname, e.firstname) как "Продавец" ИЗ заказывает ВНУТРЕННЕЕ ПРИСОЕДИНЕНИЕ клиентов b НА a.customerid = b.customerid INNER JOIN сотрудники e ON e.employeeid = a.employeeid ГРУППА ПО b.customerid, a.employeeid ЗАКАЗ ОТ b.customerid ASC, DESC «Количество заказов»;

    Язык кода: PHP (php)

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

    SQL GROUP BY — дочерняя фабрика

    Объяснение SQL GROUP BY

    Предложение GROUP BY группирует записи в итоговые строки .

    GROUP BY возвращает по одной записи для каждой группы.

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

    GROUP BY используются с агрегатами: COUNT, MAX и т. Д.

    Задача: Укажите количество продуктов для каждого поставщика, отсортировав их по убыванию.

    скопировано в буфер обмена

     ВЫБЕРИТЕ S.CompanyName, COUNT (P.Id) AS Продукты
      ОТ поставщика S
      ПРИСОЕДИНЯЙТЕСЬ к продукту P ON S.Id = P.SupplierId
     ГРУППА ПО S.CompanyName
     ЗАКАЗ ПО КОЛИЧЕСТВУ (P.Id) DESC
     
      ВЫБЕРИТЕ S.CompanyName, COUNT (P.Id) AS Продукты
      ОТ поставщика S
      ПРИСОЕДИНЯЙТЕСЬ к продукту P НА S.Id = P.SupplierId
     ГРУППА ПО S.CompanyName
     ЗАКАЗ ПО КОЛИЧЕСТВУ (P.Id) DESC
      
    Попробуйте вживую

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

    ВЫБЕРИТЕ имена столбцов
      ОТ имя-таблицы
     ГДЕ условие
     ГРУППА ПО именам столбцов
     

    Синтаксис GROUP BY с ORDER BY.

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

    ГРУППА SQL ПО СЧЕТЧИКУ

    КЛИЕНТ
    Идентификатор
    Имя
    Фамилия
    Город
    Страна
    02 Телефон02

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

    скопировано в буфер обмена

     ВЫБРАТЬ страну, COUNT (Id) AS Count
      ОТ Заказчика
     ГРУППА ПО СТРАНАМ
     
      ВЫБРАТЬ страну, COUNT (Id) AS Count
      ОТ Заказчика
     ГРУППА ПО СТРАНАМ
      
    Попробуйте вживую

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

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

    ГРУППА SQL ПО СЧЕТЧИКУ, ЗАКАЗАТЬ ПО

    КЛИЕНТ
    Идентификатор
    Имя
    Фамилия
    Город
    Страна
    02 Телефон02

    Задача: Перечислите количество клиентов в каждой стране, отсортировав по убыванию.

    скопировано в буфер обмена

     ВЫБРАТЬ страну, COUNT (Id) AS Count
      ОТ Заказчика
     ГРУППА ПО СТРАНАМ
     ORDER BY COUNT (Id) DESC
     
      ВЫБРАТЬ страну, COUNT (Id) AS Count
      ОТ Заказчика
     ГРУППА ПО СТРАНАМ
     ORDER BY COUNT (Id) DESC
      
    Попробуйте вживую

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

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

    ГРУППА SQL ПО СУММЕ, ЗАКАЗАТЬ ПО

    ЗАКАЗЧИК
    Идентификатор
    Имя
    Фамилия
    Город
    Страна
    OrderDate
    OrderNumber
    CustomerId
    TotalAmount

    Задача: Укажите общую сумму заказа для каждого покупателя, отсортированную по убыванию.

    скопировано в буфер обмена

     ВЫБРАТЬ C.FirstName, C.LastName, SUM (O.TotalAmount) AS Total
      ОТ [Заказ] O
      ПРИСОЕДИНЯЙТЕСЬ к клиенту C НА O.CustomerId = C.Id
     ГРУППА ПО C.FirstName, C.LastName
     ЗАКАЗАТЬ ПО СУММЕ (O.TotalAmount) DESC
     
      ВЫБРАТЬ C.FirstName, C.LastName, SUM (O.TotalAmount) КАК Итого
      ОТ [Заказ] O
      ПРИСОЕДИНЯЙТЕСЬ к клиенту C НА O.CustomerId = C.Id
     ГРУППА ПО C.FirstName, C.LastName
     ЗАКАЗАТЬ ПО СУММЕ (O.TotalAmount) DESC
      
    Попробуйте вживую

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

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

    Имя Фамилия Сумма
    Хорст Клосс 117483,39
    Хосе Паваротти 115673,39
    Роланд Мендель 113236.
    Оставить комментарий

    Добавить комментарий

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

    © 2019 Штирлиц Сеть печатных салонов в Перми

    Цифровая печать, цветное и черно-белое копирование документов, сканирование документов, ризография в Перми.