Group by sql ms: GROUP BY (Transact-SQL) — SQL Server

Содержание

GROUPING (Transact-SQL) — SQL Server



  • Чтение занимает 2 мин

В этой статье

Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics

Указывает, является ли указанное выражение столбца в списке GROUP BY статистическим или нет. В результирующем наборе функция GROUPING возвращает 1 (статистическое выражение) или ноль (нестатистическое выражение). Функция GROUPING может использоваться только в списке SELECT <select>, предложениях HAVING и ORDER BY, если указано предложение GROUP BY.

Синтаксические обозначения в Transact-SQL

Синтаксис

GROUPING ( <column_expression> )  

Аргументы

<column_expression>
Столбец или выражение, которое содержит столбец в предложении GROUP BY.

Типы возвращаемых данных

tinyint

Remarks

GROUPING используется, чтобы различать значения NULL, возвращаемые операторами ROLLUP, CUBE или GROUPING SETS, и стандартные значения NULL. Возвращение NULL в качестве результата операции ROLLUP, CUBE или GROUPING SETS является особым случаем использования NULL. Значение служит заполнителем столбца в результирующем наборе и означает «все».

Примеры

В следующем примере производится группирование SalesQuota и статистическая обработка сумм SaleYTD в базе данных AdventureWorks2012. Функция GROUPING применяется к столбцу SalesQuota.

SELECT SalesQuota, SUM(SalesYTD) 'TotalSalesYTD', GROUPING(SalesQuota) AS 'Grouping'  
FROM Sales.SalesPerson  
GROUP BY SalesQuota WITH ROLLUP;  
GO  

В результирующем наборе показаны два значения NULL в SalesQuota. Первый NULL представляет группу значений NULL из этого столбца в таблице. Второй NULL находится в строке итогов, добавленной операцией ROLLUP. Строка итогов содержит суммы TotalSalesYTD для всех групп SalesQuota и обозначается с помощью 1 в столбце Grouping.

Результирующий набор:

SalesQuota     TotalSalesYTD       Grouping  
------------   -----------------   --------  
NULL           1533087.5999          0  
250000.00      33461260.59           0  
300000.00      9299677.9445          0  
NULL           44294026.1344         1  

(4 row(s) affected)

См. также:

GROUPING_ID (Transact-SQL)
GROUP BY (Transact-SQL)



ROLLUP, CUBE и GROUPING SETS операторы Transact-SQL для подведения итогов и промежуточных итогов | Info-Comp.ru

В статье мы рассмотрим возможность Transact-SQL формировать отчеты, как со строкой общего итога, так и со строками промежуточных итогов, для этих целей в MS SQL Server существуют такие операторы как ROLLUP, CUBE и GROUPING SETS, именно о них мы сегодня и поговорим.

Возможность построения отчетов на Transact-SQL очень полезная, мы с Вами уже об этом говорили, когда рассматривали оператор PIVOT, который может транспонировать набор данных, теперь давайте научимся писать запросы, в которых будут выделяться промежуточные итоги и итоги в целом. В Transact-SQL сделать это можно с помощью операторов ROLLUP, CUBE и GROUPING SETS.

Как Вы, наверное, догадываетесь, для того чтобы подсчитать итог или подытог, необходимо прибегнуть к агрегатным функциям и, соответственно, к группировке данных, поэтому операторы ROLLUP, CUBE и GROUPING SETS относятся к конструкции GROUP BY, т.е. являются расширением GROUP BY.

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

Исходные данные для примеров

В качестве SQL сервера у нас будет выступать Microsoft SQL Server Express 2014, а запросы будем писать в Management Studio Express.

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

Таблица

 
   CREATE TABLE [dbo].[test_table](
        [id] [INT] IDENTITY(1,1) NOT NULL,
        [manager] [VARCHAR](50) NULL,
        [otdel] [VARCHAR](50) NULL,
        [god] [INT] NULL,
        [summa] [MONEY] NULL
   ) ON [PRIMARY]
   GO


А данные вот такие

Заметка! Если Вы не знаете, что делает вышеуказанная инструкция, рекомендую посмотреть мой видеокурс «T-SQL. Путь программиста от новичка к профессионалу. Уровень 1 – Новичок», который предназначен для начинающих. В нем подробно рассмотрены все базовые конструкции языка T-SQL.

ROLLUP

ROLLUP – оператор Transact-SQL, который формирует промежуточные итоги для каждого указанного элемента и общий итог.

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

   
   SELECT otdel, god, SUM(summa) AS itog 
   FROM dbo.test_table
   GROUP BY otdel, god
   ORDER BY otdel, god


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

Текст запроса

   
   SELECT otdel, god, SUM(summa) AS itog 
   FROM dbo.test_table
   GROUP BY 
   ROLLUP (otdel,god)


Строки со значением NULL и есть промежуточные итоги по отделам, а самая последняя строка общий итог. Согласитесь, что это уже более наглядно.

Можно также использовать rollup и с группировкой по одному полю, например:

Группировка по отделам с общим итогом


Группировка по годам с общим итогом

CUBE

CUBE — оператор Transact-SQL, который формирует результаты для всех возможных перекрестных вычислений.

Давайте напишем практически такой же SQL запрос, только вместо rollup укажем cube и посмотрим на полученный результат.

Текст запроса

   
   SELECT otdel, god, SUM(summa) AS itog 
   FROM dbo.test_table
   GROUP BY 
   CUBE (otdel,god)


В данном случае отличие от rollup заключается в том, что группировка и промежуточные итоги выполнены как для otdel, так и для god.

GROUPING SETS

GROUPING SETS – оператор Transact-SQL, который формирует результаты нескольких группировок в один набор данных, другими словами, он эквивалентен конструкции UNION ALL к указанным группам.

Пример GROUPING SETS

Текст запроса

   
   SELECT otdel, god, SUM(summa) AS itog 
   FROM dbo.test_table
   GROUP BY
   GROUPING SETS (otdel,god)


тот же результат, но с использованием UNION ALL

Текст запроса

   
   SELECT null AS otdel, god, SUM(summa) AS itog 
   FROM dbo.test_table
   GROUP BY god

   UNION ALL

   SELECT otdel, null AS god, SUM(summa) AS itog 
   FROM dbo.test_table
   GROUP BY otdel


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

GROUPING – функция Transact-SQL, которая возвращает истину, если указанное выражение является статистическим, и ложь, если выражение нестатистическое.

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

Пример GROUPING

Текст запроса

   
   SELECT otdel,
          ISNULL(CAST(god AS VARCHAR(30)), 
                 CASE WHEN GROUPING(god)=1 ANS GROUPING(otdel)=0 
                      THEN 'Промежуточный итог' 
                      ELSE 'Общий итог' END) AS god,
          SUM(summa) AS itog,
          GROUPING(otdel) AS grouping_otdel,
          GROUPING(god) AS grouping_god
   FROM dbo.test_table
   GROUP BY 
   ROLLUP (otdel,god)


На этом все, надеюсь, что возможность формировать итоги и промежуточные итоги в Microsoft SQL Server Вам будет полезна. Также рекомендую Вам почитать мою книгу «SQL код», в ней язык SQL рассматривается как стандарт, чтобы после прочтения данной книги можно было работать с языком SQL в любой системе управления базами данных. Удачи!

Нравится12Не нравится

MS-Access SQL различных GROUP BY

В настоящее время я пытаюсь SELECT DISTINCT FirstNames в GROUP , используя Microsoft Access 2010.

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

+----+-------------+-----------+
| ID | GroupNumber | FirstName |
+----+-------------+-----------+
|  1 |           1 | Peter     |
|  2 |           1 | Bob       |
|  3 |           1 | Peter     |
|  4 |           2 | Rosemary  |
|  5 |           2 | Jamie     |
|  6 |           3 | Peter     |
+----+-------------+-----------+

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

И я бы хотел, чтобы он вернул это:

+-------------+------------+
| GroupNumber | FirstNames |
+-------------+------------+
|           1 | Peter      |
|           1 | Bob        |
|           2 | Rosemary   |
|           2 | Jamie      |
|           3 | Peter      |
+-------------+------------+

Это означает, что я хочу, чтобы все отдельные FirstNames были для каждой группы.

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

Все остальные ответы, которые я нашел, либо нуждаются в агрегате, либо не применимы к MS Access, либо решаются путем работы с данными способами, неприменимыми к моему случаю. (Стандартизированные языки-хорошая вещь, не так ли?)

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

SELECT GroupNumber,
    DISTINCT FirstNames -- This is illegal, distinct applies to all
                        -- columns and doesn't respect groups.
FROM Example AS b
-- Complicated stuff to make the groups
GROUP BY GroupNumber;

Этот запрос является одноразовым и используется для анализа электронной таблицы 58000 row excel, экспортированной из другой базы данных (не моя вина), поэтому оптимизация для времени выполнения не требуется.

Я хотел бы достичь этого чисто через SQL и без VBA, если это вообще возможно.

sql

ms-access

group-by

distinct

Поделиться

Источник


Alexander Hoischen    

27 сентября 2016 в 17:11

2 ответа


  • MS SQL-присоединиться к group by

    Я очень новичок в SQL и учусь этому из книги SAMS Teach Yourself SQL in 24 hours. Моя забота — это все о соединениях и группировке выбранных выходных данных. Вот структура моих таблиц: CREATE TABLE ORDERS_TBL ( ORD_NUM VARCHAR(10) NOT NULL primary key, CUST_ID VARCHAR(10) NOT NULL, PROD_ID…

  • SQL Group By запрос

    У меня есть следующая таблица с одним столбцом ArbPlWPos : +————+ + IH-MKE + + IH-MKEEA + + IH-MKEEB + + IH-MKEPE + + IH-MKEPM + + IH-MVKE1 + + IH-MVKM1 + +————+ Я могу запустить оператор в MS Access, который группируется по первым 6 буквам: SELECT left(ArbPlWPos, 6),. ..



2

Это должно сработать:

SELECT DISTINCT GroupNumber, FirstNames
FROM Example AS b

Поделиться


Kashif Qureshi    

27 сентября 2016 в 17:37



1

Решением этой проблемы было бы group by столбцы GroupNumber и FirstName одновременно. Запрос представлен ниже:

Select GroupNumber,  FirstName
From input
Group By GroupNumber, FirstName

(Стандартизированные языки-хорошая вещь, не так ли?)

Поделиться


Quote    

27 сентября 2016 в 22:31


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

ms access ошибка запроса

Я конвертирую свою базу данных из SQL Server в MS Access. Этот запрос отлично работает в SQL Server, но имеет синтаксическую ошибку в MS-Access. Так что же не так с этим утверждением SQL?? select *…

MS Access для SQL вопрос запрос

У меня есть этот запрос, который должен использоваться в MS Access, но база данных — это база данных SQL. Когда я запускаю этот запрос в среде SQL, он работает отлично. Однако при запуске в MS…

Доступ SQL Group by с условием

Я использую MS Access для следующей задачи (из-за офисных ограничений). Я совсем новичок в SQL. У меня есть следующая таблица: Я хочу выбрать все магазины, сгруппированные по улице, zip и месту. Но…

MS SQL-присоединиться к group by

Я очень новичок в SQL и учусь этому из книги SAMS Teach Yourself SQL in 24 hours. Моя забота — это все о соединениях и группировке выбранных выходных данных. Вот структура моих таблиц: CREATE TABLE…

SQL Group By запрос

У меня есть следующая таблица с одним столбцом ArbPlWPos : +————+ + IH-MKE + + IH-MKEEA + + IH-MKEEB + + IH-MKEPE + + IH-MKEPM + + IH-MVKE1 + + IH-MVKM1 + +————+ Я могу запустить. ..

ms access GROUP BY ошибка

Я пытаюсь запустить этот SQL в MS доступе SELECT `orig`.`SONG TITLE`,`orig`.`PUBLISHER`,`orig`.`CFG DESCRIPTION` FROM `Sheet1` AS `orig` INNER JOIN `Sale type` AS `Sale` ON orig.`CFG…

Как выполнить чувствительный к регистру group by в MS Access

В базе данных MS Access найти несоответствие (т. е. разницу) записей между двумя таблицами(Employee и Employee_PROD) Я использую Союз все . Запрос выглядит следующим образом: SELECT…

MS Access Подсчет Различных Нескольких Столбцов

Я пытался написать запрос на основе SQL, используя Count distinct, но столкнулся с проблемами в том, как правильно структурировать формат для Microsoft Access. Мой текущий запрос находится в…

Group By и группы групп в MS Access

Я пытаюсь написать запрос в MS Access, используя group by, который приводит к подсчету двух групп, а затем к подсчету оставшихся групп вместе взятых. Итак, если у меня есть цвет поля и 18 элементов,…

преобразование запроса access group by в запрос sql server

Я не могу преобразовать запрос MS Access в запрос SQL SERVER с изменением столбцов group by, потому что это повлияет на конечный результат. Целью данного запроса является расчет кредитора и должника…

SQL Предложение GROUP BY | Решения для баз данных для Microsoft Access

GROUP BY: Организационная статья SQL

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

SQL GROUP BY — правильный выбор, когда вы выбираете несколько
столбцы из одной или нескольких таблиц, а также выполнение математических
операции при их выборе. Вы должны ГРУППИРОВАТЬ по всем остальным столбцам
кроме одного с математическим оператором. Вы не можете сделать больше
чем одна математическая операция. И вы не можете группировать по столбцам с
Свойства поля Memo, General или Blob.

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

Синтаксис группы SQL по:

 ВЫБРАТЬ «имя_столбца1», СУММ («имя_столбца2»)
ОТ "table_name"
ГРУППА ПО "имя_столбца1"
 

В этом синтаксисе «column_name1» представляет один или несколько столбцов.
возвращается по вашему запросу.Это может быть поле в таблице с именем FROM
оператор, псевдоним таблицы из списка SELECT или числовое выражение
с указанием позиции столбца, начиная с 1 слева.

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

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

 SELECT store_name, SUM (Продажи)
ОТ Store_Information
GROUP BY store_name
 

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

Помимо функции СУММ, вы можете использовать операции. Например, вы
можно использовать COUNT для выполнения простого подсчета инвентаря сотрудников,
или отфильтрованных элементов. Если вам нужно знать, сколько продуктов вы
в ценовом диапазоне $ 200-400, вы выполните следующее:

 SELECT items, COUNT (*) как «200-400 $ Inventory Items»
ИЗ инвентаря
ГДЕ цена> = 200 И цена
           

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

Вы можете выполнять аналогичные функции с помощью MIN и MAX

Несколько столбцов группировки:

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

 ВЫБОР отдел, работа
Средняя зарплата как "Средняя зарплата"
ИЗ списка сотрудников
ГРУППА ПО отделам, вакансиям
 

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

Общие сведения о функциях GROUPING и GROUPING_ID в SQL Server — {coding} Взгляд

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

Функции GROUPING и GROUPING_ID используются для определения того, агрегируются ли столбцы в списке GROUP BY (с использованием операторов ROLLUP или CUBE) или нет.

Есть два основных различия между функциями GROUPING и GROUPING_ID.

Это следующие:

  • Функция GROUPING применима к одному столбцу, тогда как список столбцов для функции GROUPING_ID должен соответствовать списку столбцов в предложении GROUP BY.
  • Функция GROUPING указывает, является ли столбец в списке GROUP BY агрегированным или нет.Он возвращает 1, если набор результатов агрегирован, и 0, если набор результатов не агрегирован.

С другой стороны, функция GROUPING_ID также возвращает целое число. Однако он выполняет преобразование двоичного кода в десятичное после объединения результатов всех функций ГРУППИРОВКИ.

В этой статье мы увидим функции GROUPING и GROUPING_ID в действии с помощью примеров.

Подготовка фиктивных данных

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

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

 CREATE База данных компании;

 Компания USE;

СОЗДАТЬ ТАБЛИЦУ сотрудника
(
    id INT ПЕРВИЧНЫЙ КЛЮЧ,
    name VARCHAR (50) NOT NULL,
    пол VARCHAR (50) NOT NULL,
    зарплата INT NOT NULL,
    отдел VARCHAR (50) NOT NULL
 )

 ВСТАВИТЬ сотрудника

ЗНАЧЕНИЯ
(1, Дэвид, Мужчина, 5000, Продажи),
(2, «Джим», «Женский», 6000, «HR»),
(3, «Катя», «Женщина», 7500, «ИТ»),
(4, «Воля», «Мужской», 6500, «Маркетинг»),
(5, «Шейн», «Женский», 5500, «Финансы»),
(6, Сарай, Мужской, 8000, Продажи),
(7, Вик, Мужской, 7200, HR),
(8, «Винс», «Женщина», 6600, «ИТ»),
(9, «Джейн», «Женщина», 5400, «Маркетинг»),
(10, «Лаура», «Женский», 6300, «Финансы»),
(11, Mac, Мужской, 5700, Продажи),
(12, «Пат», «Мужской», 7000, «HR»),
(13, «Джули», «Женщина», 7100, «ИТ»),
(14, «Элис», «Женщина», 6800, «Маркетинг»),
(15, Уэйн, Мужчина, 5000, Финансы)

 

В приведенном выше сценарии мы создали базу данных с именем «Компания».Затем мы создали таблицу «Сотрудник» в базе данных компании. Наконец, мы вставили несколько фиктивных записей в таблицу Employee.

ГРУППИРОВКА Функция

Как упоминалось выше, функция GROUPING возвращает 1, если набор результатов агрегирован, и 0, если набор результатов не агрегирован.

Взгляните на следующий сценарий, чтобы увидеть, как работает функция ГРУППИРОВКА.

 ВЫБРАТЬ
отдел АС Отдел,
пол КАК Пол,
sum (зарплата) как Salary_Sum,
ГРУППИРОВКА (отдел) как GP_Department,
ГРУППА (пол) как GP_Gender
ОТ сотрудника
ГРУППА ПО РОЛИКЕ (отдел, пол)
 

Приведенный выше сценарий подсчитывает сумму зарплат всех сотрудников мужского и женского пола, которые сгруппированы сначала по столбцу «Отдел», а затем по столбцу «Пол».Добавлены еще два столбца для отображения результата применения функции ГРУППИРОВКА к столбцам «Отдел» и «Пол».

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

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

Внимательно посмотрите на вывод. Сумма зарплат отображается по полу по полу отдела (строки 1, 2, 4, 5, 7, 9, 10 и 12). Затем он также агрегируется только по полу (строки 3, 6, 8, 11 и 13).Наконец, в строке 14 отображается общая сумма зарплат, агрегированная по департаментам и гендерным вопросам.

1 отображается в столбце функции ГРУППИРОВКА GP_Gender для строк, где результаты агрегированы по полу, т.е. строки 3, 6, 8, 11 и 13. Это связано с тем, что столбец GP_Gender содержит результат функции ГРУППИРОВКА, примененной к столбцу Пол.

Точно так же строка 14 содержит агрегированную сумму всех отделов и всех столбцов. Поэтому для столбцов GP_Department и GP_Gender возвращается 1.

Вы можете видеть, что NULL отображается в столбцах «Отдел» и «Пол» в выходных данных, где результаты суммируются. Например, в строке 3 в столбце «Пол» отображается NULL, поскольку результаты агрегированы по столбцу «Пол» и поэтому нет значения столбца для отображения. Мы не хотим, чтобы наши пользователи видели NULL, лучшим словом здесь могло бы быть «Все полы».

Для этого нам нужно изменить наш скрипт следующим образом:

 ВЫБРАТЬ
СЛУЧАЙ, КОГДА ГРУППА (отдел) = 1 ТОГДА 'Все отделы' ИНАЧЕ ЕСТЬ НУЛЬ (отдел, "Неизвестно") КОНЕЦ как Отдел
СЛУЧАЙ, КОГДА ГРУППА (пол) = 1 ТОГДА «Все полы» ИНАЧЕ НЕ НУЖНА (пол, «Неизвестно») END как Пол,
сумма (зарплата) как Salary_Sum
ОТ сотрудника
ГРУППА ПО РОЛИКЕ (отдел, пол)
 

В приведенном выше сценарии, если функция ГРУППИРОВКА, примененная к столбцу «Отдел», возвращает 1, а в столбце «Отдел» отображается «Все отделы».В противном случае, если столбец «Отдел» содержит значение NULL, будет отображаться «Неизвестно». Столбец «Пол» был изменен таким же образом.

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

Вы можете видеть, что NULL в столбцах «Отдел» и «Пол», где функция ГРУППИРОВКА возвращает 1, был заменен на «Все отделы» и «Все полы» соответственно.

GROUPING_ID Функция

Функция GROUPING_ID объединяет вывод функций GROUPING, применяемых ко всем столбцам, указанным в предложении GROUP BY.Затем он выполняет преобразование из двоичного в десятичное, прежде чем вернуть окончательный результат.

Давайте сначала объединим вывод, возвращаемый функцией GROUPING, примененной к столбцам «Отдел» и «Пол». Взгляните на следующий скрипт:

 ЕГЭ компания
ВЫБРАТЬ
отдел АС Отдел,
пол КАК Пол,
sum (зарплата) как Salary_Sum,
CAST (ГРУППИРОВКА (отдел) КАК VARCHAR (1)) +
CAST (GROUPING (пол) AS VARCHAR (1)) как группировка
ОТ сотрудника
ГРУППА ПО РОЛИКЕ (отдел, пол)
 

В выводе вы увидите 0 и 1, возвращаемые функцией GROUPING, соединенные вместе.Результат выглядит так:

Функция GROUPING_ID просто возвращает десятичный эквивалент двоичного значения, сформированного в результате конкатенации значений, возвращаемых функциями GROUPING.

Выполните следующий сценарий, чтобы увидеть в действии функцию GROUPING ID:

 ЕГЭ компания
ВЫБРАТЬ
отдел АС Отдел,
пол КАК Пол,
sum (зарплата) как Salary_Sum,
CAST (ГРУППИРОВКА (отдел) КАК VARCHAR (1)) +
CAST (GROUPING (пол) AS VARCHAR (1)) как группировка,
GROUPING_ID (отдел, пол) как Grouping_Id
ОТ сотрудника
ГРУППА ПО РОЛИКЕ (отдел, пол)
 

Для строки 1 функция GROUPING ID вернет 0, поскольку десятичный эквивалент «00» равен нулю.

Для строк 3, 6, 8, 11 и 13 функция GROUPING_ID возвращает 1, поскольку десятичный эквивалент «01» равен 1.

Наконец, для строки 14 функция GROUPIND_ID возвращает 3, поскольку двоичный эквивалент «11» равен 3.

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

См. Также:

Microsoft: Обзор Grouping_ID

Microsoft: Обзор группировки

YouTube: Grouping & Grouping_ID

Бен Ричардсон руководит организацией Acuity Training.Acuity — это компания, занимающаяся обучением в сфере ИТ, предлагающая аудиторные курсы в Лондоне и Гилфорде. Он является ведущим поставщиком обучения SQL в Великобритании и предлагает полный спектр обучения SQL от вводного обучения до курсов продвинутого администрирования. Последние сообщения Бена Ричардсона (посмотреть все)

Групповые функции SQL Server | Рам Кедем

Это руководство по SQL фокусируется на групповых функциях SQL в SQL Server и содержит объяснения, примеры и упражнения. Для упражнений этого урока используйте эту ссылку.

Определение

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

Общие групповые функции SQL Server

Функция Описание Синтаксис
СУММ Возвращает общую сумму
СУММА (зарплата)
- Результат: 20000
 
МИН Возвращает наименьшее значение
МИН (зарплата)
- Результат: 1000
 
МАКС Возвращает максимальное значение
МАКС (зарплата)
- Результат: 7000
 
СРЕДНЯЯ Возвращает среднее значение
AVG (зарплата)
- Результат: 4000
 
СЧЕТЧИК (*) Возвращает количество записей в таблице
СЧИТАТЬ(*)
- Результат: 5
 
COUNT (столбец) Возвращает количество значений (значения NULL не учитываются) указанного столбца
COUNT (имя)
- Результат: 4
 
COUNT (DISTINCT столбец) Возвращает количество различных значений
COUNT (ОТЛИЧНОЕ имя)
- Результат: 3
 

* Результаты основаны на вышеприведенной иллюстрации

Функции группы SQL Server и NULL

  • В SQL Server все групповые функции игнорируют значения NULL.Например: средняя зарплата рассчитывается на основе строк в таблице, где хранится действительное значение (общая зарплата, деленная на количество сотрудников, получающих зарплату).
  • В SQL Server Вы можете использовать функцию ISNULL, чтобы заставить групповые функции включать значения NULL, в следующем примере среднее значение вычисляется на основе всех строк в таблице, независимо от того, хранятся ли значения NULL в столбце зарплаты (общая зарплата деленное на общее количество строк в таблице):
ВЫБРАТЬ СРЕДНЕЕ (ISNULL (зарплата, 0))
ОТ сотрудников
 

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

ВЫБЕРИТЕ имя_столбца, функцию_группы (имя_столбца)
FROM table_name
ГДЕ условие
ГРУППА ПО имя_столбца
 

До сих пор каждая описанная здесь групповая функция обрабатывала таблицу как одну большую группу данных.В большинстве случаев вам нужно разделить таблицу на более мелкие группы, вместо того, чтобы получать среднюю зарплату всех сотрудников в таблице Сотрудники, вы бы предпочли увидеть, например, среднюю зарплату, сгруппированную по каждому отделу (какова средняя зарплата HR отдел, ИТ-отдел и так далее).

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

ВЫБЕРИТЕ Department_id, AVG (зарплата)
ОТ сотрудников
ГРУППА ПО идентификатору отдела
 

Несколько указаний

Все столбцы в предложении SQL Server SELECT, которые не являются групповыми функциями, должны быть в предложении GROUP BY

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

Столбцы SQL Server GROUP BY не обязательно должны быть в предложении SQL Server SELECT

Совершенно возможно группировать по разным столбцам, но не указывать эти столбцы в предложении SQL Server SELECT (однако результат не будет иметь смысла). В этом примере мы отображаем среднюю зарплату для каждого отдела без отображения номеров соответствующих отделов.

ВЫБЕРИТЕ СРЕДНЮЮ (зарплату)
ОТ сотрудников
ГРУППА ПО идентификатору отдела
 

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

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

ВЫБЕРИТЕ Department_id, job_id, AVG (зарплата)
ОТ сотрудников
ГДЕ Department_id IN (50, 80, 90)
ГРУППА ПО идентификатору отдела, идентификатору задания
 

Используя предложение SQL Server WHERE, вы можете исключить строки перед их разделением на группы.

Например, если вам нужно отобразить среднюю зарплату только для отделов 50, 80 и 90:

ВЫБЕРИТЕ Department_id, AVG (зарплата)
ОТ сотрудников
ГДЕ Department_id IN (50, 80, 90)
ГРУППА ПО идентификатору отдела
 

Вы не можете использовать предложение SQL Server WHERE для ограничения групп

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

Отделения, в которых средняя заработная плата выше 5000:

 ВЫБЕРИТЕ Department_id, AVG (зарплата)
 ОТ сотрудников
 ГДЕ СРЕДН (зарплата)> 5000
 ГРУППА ПО идентификатору отдела

(ошибка)
 

Оговорка HAVING

Предложение SQL Server HAVING позволяет фильтровать агрегированные результаты, полученные с помощью предложения SQL Server GROUP BY.Точно так же, как вы использовали предложение WHERE SQL Server для ограничения строк, вы используете предложение SQL Server HAVING для ограничения групп.

ВЫБЕРИТЕ имя_столбца, функцию_группы (имя_столбца)
FROM table_name
ГДЕ условие
ГРУППА ПО имя_столбца
ИМЕЮЩИЕ условие
 

Отделения, в которых средняя заработная плата выше 5000:

ВЫБЕРИТЕ Department_id, AVG (зарплата)
 ОТ сотрудников
 ГРУППА ПО идентификатору отдела
 ИМЕЕТ СРЕДНЮЮ (зарплату)> 5000
 

В одном запросе можно использовать как предложения SQL Server HAVING, так и WHERE.Из отделов 80, 50 и 90 отделения, в которых средняя заработная плата выше 5000:

ВЫБЕРИТЕ Department_id, AVG (зарплата)
ОТ сотрудников
ГДЕ Department_id IN (50, 80, 90)
ГРУППА ПО идентификатору отдела
ИМЕЕТ СРЕДНЮЮ (зарплату)> 5000
 

Вы можете фильтровать на основе другой групповой функции, отличной от той, которая отображается в операторе SELECT SQL Server:

 ВЫБЕРИТЕ Department_id, AVG (зарплата)
 ОТ сотрудников
 ГДЕ Department_id IN (50, 80, 90)
 ГРУППА ПО идентификатору отдела
 ИМЕЮЩИЙ МАКС (зарплата)> 5000
 

Microsoft Access GROUP BY Запрос

В Microsoft Access GROUP BY — это предложение, которое можно использовать для объединения записей с идентичными значениями в определенном поле в одну запись.Если вы включите агрегатную функцию SQL в оператор SELECT, такую ​​как AVG, COUNT или SUM, Access создаст итоговое значение для каждой записи.

Инструкции в этой статье относятся к Access для Microsoft 365, Access 2019, 2016, 2013 и 2010.

Михайломилованович / Getty Images

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

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

  1. Запустите Access и откройте свою базу данных.

  2. Выберите вкладку Create .

  3. В группе Запросы выберите Дизайн запросов .

  4. В списке Добавить таблицы выберите таблицу, с которой вы хотите работать.

  5. Выберите View в группе результатов и выберите SQL View .

  6. Основное тело переключится в окно терминала запросов.Здесь вы можете ввести любой запрос.

  7. Чтобы получить базовую группировку из SQL, вы должны ввести что-то вроде этого:

    ВЫБЕРИТЕ * ИЗ имя таблицы ГДЕ столбец / категория КАК «запись»; 

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

Разбор запроса

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

  • OrderID : числовое значение, однозначно идентифицирующее каждый заказ.Это поле является первичным ключом для базы данных.
  • Продавец : текстовое значение, содержащее имя продавца, продавшего товары. Это поле является внешним ключом для другой таблицы, содержащей информацию о персонале.
  • CustomerID : числовое значение, соответствующее номеру счета клиента. Это поле также является внешним ключом, ссылаясь на таблицу, содержащую информацию об учетной записи клиента.
  • Доход : числовое значение, соответствующее долларовой сумме продажи.

Когда приходит время проводить оценку эффективности для продавцов, таблица «Заказы» содержит ценную информацию, которая может быть использована для этого обзора. При оценке Джима вы можете, например, написать простой запрос, который извлекает все записи Джима о продажах:

ВЫБЕРИТЕ * ИЗ заказов, ГДЕ продавец НРАВИТСЯ «Джим»; 

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

OrderID Продавец CustomerID Доход 
12482 Jim 182 40000
12488 Jim 219 25000
12519 Jim 137 85000
12602 Jim 182 10000
12741 Jim 155


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

Вот пример. Если вы выполнили следующий оператор SQL:

ВЫБЕРИТЕ продавца, СУММ (доход) КАК "Итого", МИН (доход) КАК "Наименьшее", МАКС (доход) КАК "Наибольшее", СРЕДНЕЕ (доход) КАК "Среднее", COUNT (доход) КАК "Число" ИЗ ГРУППЫ заказов. ПО продавцу; 

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

Всего наименьшее наибольшее среднее число 
Джим 250000 10000

50000 5


Мэри 342000 24000 102000 57000 6
Боб 118000 4000 36000 39333 3

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

Спасибо, что сообщили нам!

Расскажите, почему!

Другой

Недостаточно подробностей

Сложно понять

SQL Server GROUP BY operator

SQLS * Plus — лучший инструмент для создания отчетов и автоматизации из командной строки SQL Server! SQLS * Plus на несколько порядков лучше, чем инструменты командной строки SQL Server sqlcmd и osql.

Главная »Блог SQL Server» SQL Server GROUP BY оператор

26 июня 2020

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

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

SELECT expr1, expr2,… expr_n,
aggregate_function (aggregate_expr)
FROM tab
[WHERE conds]

[ЗАКАЗАТЬ ПО expr [ASC | DESC]];

где:

  • expr1,2,… _n — Выражения, которые не инкапсулированы в агрегатной функции и должны быть включены в GROUP BY в конце запроса SQL.
  • aggr_function — это агрегатная функция, такая как SUM, COUNT, MIN, MAX или AVG.
  • aggr_expression — это столбец или выражение, для которого будет использоваться агрегатная функция.
  • вкладка — Таблицы, из которых вы хотите сделать записи. Предложение FROM должно содержать хотя бы одну таблицу.
  • WHERE conds — Необязательно. Это условия, которые должны быть выполнены для выбора записей.
  • ЗАКАЗАТЬ В — Необязательно.Выражение, используемое для сортировки записей в наборе результатов. Если указано более одного выражения, значения должны быть разделены запятыми.
  • ASC — Необязательно. ASC сортирует набор результатов в порядке возрастания. Это поведение по умолчанию, если не указан модификатор.
  • DESC — Необязательно. DESC сортирует набор результатов в порядке убывания.

Использование GROUP BY с функцией SUM

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

emp_number f_name l_name sal dept
10017

Just4 500
1002 Селена Гомес 57500 500
1003 Мила Кунис 71000 9017 9017 9017 9017 9017 9017 9017 9017 9017 9017 42000 501

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

SELECT dept,
SUM (зарплата) AS total_sal
FROM сотрудников
GROUP BY dept;

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

В этом примере мы использовали функцию

. чтобы сложить все зарплаты для каждого отдела, и мы дали прозвище «total_sal» результатам SUM (sal). Поскольку dept не инкапсулирован в функции SUM, он должен быть указан в предложении GROUP BY.

Использование GROUP BY с функцией COUNT

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

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

dept total_sal
500 119500
501 113000
prod_id prod_name cat_id
1 Груша Банан 50
3 Оранжевый 50
4 Яблоко 50
5 Хлеб 75
7 Kleenex NULL

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

SELECT cat_id,
COUNT (*) AS total_prod_prod
NULL
ГРУППА ПО cat_id
ORDER BY cat_id;

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

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

Использование GROUP BY с функцией MIN

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

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

100173

В наличии Cruise

emp_number f_name l_name sal dept
42000 501

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

SELECT dept,
MIN (sal) AS low_sal
FROM empl

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

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

Использование GROUP BY с функцией MAX

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

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

dept low_sal
500 57500
501 42000
emp_number f_name l_name sal dept 9017

Джастин Бибер 62000 500
1002 Селена Гомес 57500 500
1003

Tom Cruise 42000 501

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

SELECT dept,
MAX (sal) AS наивысший FR_sal
empl отдел;

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

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

Дополнительные примеры:

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

dept high_sal
500 62000
501 71000
f_id f_name f_age f_sal
1
2 Селена 23 200
3 Мила 23 300
4 Том 24 2000
6 Daniel 25 1000

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

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

SELECT f_age, SUM (f_sal) как сумма FROM worker_1 GROUP BY f_age

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

f_age сумма
23 600
24 3000
25 Пример №2
В этом примере мы используем дополнительное условие, при котором брать не все записи из таблицы:

SELECT f_age, SUM (f_sal) как сумма FROM worker_1 WHERE id> = 2 GROUP BY f_age

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

901 86

f_age сумма
23 500
24 3000
25 1000

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

SELECT f_age, MAX (f_sal) as max FROM worker_1 GROUP BY f_age

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

f_age max sal
23 300
24 2000
25 1000
25 функции min найдем минимальную заработную плату в этой группе:

SELECT f_age, MIN (f_sal) as min FROM worker_1 GROUP BY f_age

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

9018 6

f_age мин. салона
23 100
24 1000
25 1000

Пример №5
А теперь с помощью функции count вы найдете количество записей в группе:

SELECT f_age, COUNT (*) as count FROM worker_1 GROUP BY f_age

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

Общие сведения об использовании предложения GROUP BY в SQL

Теги: SQL, sql server, sqls, sqls ms

Обобщение данных с помощью оператора GROUPING SETS

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

В T-SQL вы суммируете данные с помощью предложения GROUP BY в агрегатном запросе. Это предложение создает группы, которые определяются набором выражений. Возвращается одна строка для каждой уникальной комбинации выражений в предложении GROUP BY , а агрегатные функции, такие как COUNT или SUM , могут использоваться в любых столбцах запроса. Однако, если вы хотите сгруппировать данные по нескольким комбинациям группировки по выражениям, вы можете использовать один из двух подходов.Первый подход - создать один сгруппированный запрос для каждой комбинации выражений и объединить результаты с помощью оператора UNION ALL . Другой подход - использовать оператор GROUPING SETS вместе с предложением GROUP BY и определять каждый набор группировок в одном запросе.

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

Подготовьте набор данных

Все запросы в этой статье будут выполняться в базе данных AdventureWorks2012.Если вы хотите следить за этой статьей, загрузите ее отсюда.

Пример использования: аналитик данных Adventure Works

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

Запрос 1. Годовой доход

ЕГЭ AdventureWorks2012;

GO

ВЫБРАТЬ

ГОД (Дата заказа) КАК Год заказа,

СУММА (Промежуточный итог) КАК Доход

ОТ продаж.SalesOrderHeader

ГРУППА ПО ГОДУ (OrderDate)

ORDER BY OrderYear;

ГО

Запрос 1 возвращает следующий набор результатов:

ЗаказатьГод

Доход

2005

11331809

2006

30674773,2

2007

42011037.2

2008

25828762,1

Таблица 1. Годовой доход компании.

Согласно Таблице 1, компания регистрировала доход в период с 2005 по 2008 год. Предполагая, что валюта находится в долларах США, в 2005 году их доход составил около одиннадцати миллионов долларов. В 2006 году это было около тридцати миллионов долларов и так далее. Такая информация будет полезна для поддержки бизнес-решения, такого как открытие филиала компании в другом месте.

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

Запрос 2. Доход компании за год и месяц.

ВЫБЕРИТЕ

ГОД (OrderDate) КАК OrderYear,

МЕСЯЦ (OrderDate) КАК OrderMonth,

СУММА (Промежуточный итог) КАК Доход

ОТ продаж.SalesOrderHeader

ГРУППА ПО ГОДУ (Дата заказа), МЕСЯЦ (Дата заказа)

ПОРЯДОК ПО ГОДУ заказа, Месяцу заказа;

ГО

В следующей таблице содержится набор результатов запроса 2:

ЗаказатьГод

ЗаказатьМесяц

Доход

2005

7

962716.742

2005

8

2044600

2005

9

1639840,11

2005

10

1358050,47

2005

11

2868129,2

2005

12

2458472.43

2006

1

1309863,25

2006

2

2451605,62

2006

3

2099415.62

2006

4

1546592,23

2006

5

2942672.91

2006

6

1678567,42

2006

7

2894054,68

2006

8

4147192.18

2006

9

3235826.19

2006

10

2217544.45

2006

11

3388911.41

2006

12

2762527.22

2007

1

1756407.01

2007

2

2873936.93

2007

3

2049529.87

2007

4

2371677,7

2007

5

3443525.25

2007

6

2542671.93

2007

7

3554092.32

2007

8

5068341.51

2007

9

5059473.22

2007

10

3364506.26

2007

11

4683867,05

2007

12

5243008,13

2008

1

3009197.42

2008

2

4167855,43

2008

3

4221323,43

2008

4

3820583,49

2008

5

5194121,52

2008

6

5364840.18

2008

7

50840,63

Таблица 2. Прибыль компании за год и месяц.

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

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

Предположим, бизнес-менеджер Adventure Works хочет визуализировать оба результата в одном наборе результатов. Для этого вы можете объединить предыдущие запросы - Query 1 и Query 2 - с помощью оператора UNION ALL . Сначала измените запрос 1, добавив фиктивный столбец, чтобы в нем было такое же количество столбцов, что и в запросе 2.Все запросы, объединенные оператором UNION , должны иметь одинаковое количество столбцов. Этот фиктивный столбец вернет NULL в столбце OrderMonth, идентифицируя итоговые строки OrderYear этого запроса. Запрос UNION ALL выглядит так:

Запрос 3. Прибыль компании за год и за год и за месяц.

SELECT

YEAR (OrderDate) AS OrderYear,

NULL AS OrderMonth, --Dummy Column

SUM (SubTotal) AS Доходы

ОТ продаж.SalesOrderHeader

ГРУППА ПО ГОДУ (OrderDate)

UNION ВСЕ

SELECT

YEAR (OrderDate) AS OrderYear,

МЕСЯЦ (OrderDate) AS OrderMonth,

OM SUM (Промежуточный итог

.SUMA (Промежуточный итог продаж

) AS Incomes ГРУППА ПО ГОДУ (Дата заказа), МЕСЯЦ (Дата заказа)

ORDER BY OrderYear, OrderMonth;

ГО

На рисунке 1 показан набор результатов, созданный запросом 3. Просмотрите комментарии на рисунке, которые определяют наборы группирования.

Рисунок 1. Прибыль компании за год и за год и за месяц. Обратите внимание на комментарии, добавленные к рисунку.

Эта информация не выглядит новой, потому что вы уже знаете, что в 2005 году доход компании составлял около одиннадцати миллионов долларов. В июле 2005 года доход компании составлял около девятисот шестидесяти тысяч долларов и так далее. Что нового для вас, так это то, что каждый результат группировки - результат группировки за год и результат группировки за год и месяц - объединен.

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

Рисунок 2. Выделение заполнителей.

Если в запросе задействовано несколько групп по списку выражений, NULL используется в качестве заполнителя для идентификации одной из групп в результатах. Снова посмотрев на рисунок 2, строка, в столбце OrderMonth которой указано NULL, означает, что строка принадлежит к группе года заказа.Если строка имеет значение как в столбцах OrderYear, так и OrderMonth, это означает, что строка принадлежит к группе года и месяца заказа. Такая ситуация возникает, когда в одном из сгруппированных запросов не одинаковое количество сгруппированных столбцов. В этом примере первая группировка - по году заказа, а вторая - по году и месяцу заказа.

Несмотря на то, что вы получили желаемый результат, запрос 3 был бы еще больше, если бы вы добавили другой набор групп, например, день заказа. Как аналитик данных вы решили поискать в Интернете способ достижения тех же результатов, но с меньшими усилиями.Вы обнаружите, что с помощью оператора GROUPING SETS вы должны получить тот же набор результатов, но с меньшим количеством кода! Это действительно мотивирует вас, и вы пишете следующий запрос, используя GROUPING SETS :

Запрос 4. Получение того же набора результатов, созданного Запросом № 3, но с использованием предложения GROUPING SETS.

ВЫБЕРИТЕ

ГОД (OrderDate) КАК OrderYear,

МЕСЯЦ (OrderDate) КАК OrderMonth,

СУММА (Промежуточный итог) КАК Доходы

ОТ продаж.SalesOrderHeader

GROUP BY

НАБОРЫ ГРУППИРОВКИ

(

YEAR (OrderDate), --1-й набор группировок

(YEAR (OrderDate), MONTH (OrderDate)) - 2-й набор группировок

);

ГО

Набор результатов, созданный запросом 4, тот же, что и на рисунке 1. На рисунке 3 показаны результаты, но новый метод требует меньше кода. Оператор GROUPING SETS используется вместе с предложением GROUP BY и позволяет выполнять запросы с несколькими группами, просто указав наборы группировки, разделенные запятыми.Однако при указании наборов группирования следует соблюдать осторожность. Например, если группа содержит два столбца, скажем, столбец A и столбец B, оба столбца должны быть заключены в круглые скобки: (столбец A, столбец B). Если между ними нет скобок, предложение GROUPING SETS определит их как отдельные группы, и запрос не вернет желаемых результатов.

Рисунок 3. Доход компании за год, за год и за месяц с использованием пункта GROUPING SETS.

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

Запрос 5. Доход компании за год, за год и за месяц и в целом.

ВЫБЕРИТЕ

ГОД (OrderDate) КАК OrderYear,

МЕСЯЦ (OrderDate) КАК OrderMonth,

СУММА (Промежуточный итог) КАК Доходы

ОТ продаж.SalesOrderHeader

GROUP BY

НАБОРЫ ГРУППИРОВКИ

(

YEAR (OrderDate), --1-й набор группировок

(YEAR (OrderDate), MONTH (OrderDate)), --2nd grouping set

() --3rd группирующий набор (всего)

);

ГО

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

Рисунок 4. Доход компании за год, за год, за месяц и за все время.

Кстати, если вы спросите себя: «Что произойдет, если NULL будет частью данных и не будет использоваться в качестве заполнителя?» или «Как узнать, используется ли NULL в качестве заполнителя или просто значение?» В этом примере я убедился, что сгруппированные столбцы не допускают значения NULL, поэтому NULL используются в качестве заполнителей. В случае, если сгруппированные столбцы допускают значение NULL, вам нужно будет использовать функцию GROUPING или GROUPING_ID , чтобы определить, получено ли NULL из оператора GROUPING SETS - он также может поставляться с другими операторами группировки, такими как ROLLUP и CUBE - или это часть данных.Обе функции - GROUPING и GROUPING_ID - будут рассмотрены в другой статье.

Заключение

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

Я предлагаю вам попрактиковаться в том, что вы узнали из этой статьи; эта тема очень важна для всех, кто работает с данными SQL Server. Объем данных увеличивается очень быстро, и очень важно обобщить их, чтобы лучше понять бизнес.

Предложение GROUP BY (Microsoft Jet SQL)

GROUP BY Пункт

Объединяет записи с одинаковыми значениями в указанном списке полей в одну запись.Сводное значение создается для каждой записи, если вы включаете агрегатную функцию SQL, такую ​​как Sum или Count , в оператор SELECT.

Синтаксис

ВЫБРАТЬ список полей
ИЗ стол
ГДЕ критерии
[GROUP BY groupfieldlist ]

Оператор SELECT, содержащий предложение GROUP BY, состоит из следующих частей:

Часть Описание
список полей Имя поля или полей, которые должны быть получены вместе с любыми псевдонимами имен полей, агрегатными функциями SQL, предикатами выбора (ALL, DISTINCT, DISTINCTROW или TOP) или другими параметрами оператора SELECT.
стол Имя таблицы, из которой извлекаются записи. Для получения дополнительной информации см. Предложение FROM.
критерии Критерии отбора. Если оператор включает предложение WHERE, ядро ​​базы данных Microsoft Jet группирует значения после применения условий WHERE к записям.
groupfieldlist Имена до 10 полей, используемых для группировки записей.Порядок имен полей в groupfieldlist определяет уровни группировки от самого высокого до самого низкого уровня группировки.

Примечания

GROUP BY не является обязательным.

Сводные значения опускаются, если в операторе SELECT нет агрегатной функции SQL.

Нулевые значения в полях GROUP BY сгруппированы и не пропускаются. Однако значения Null не оцениваются ни в одной агрегатной функции SQL.

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

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

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