Как сгруппировать и агрегировать данные с помощью SQL?

Опубликовано: 1 Сентября, 2022

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

Теперь давайте разберемся с этим на примере.

Прежде чем начать, мы должны иметь в виду несколько важных моментов:

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

  • Если вы запустите эту команду SQL, вы увидите ошибку, потому что база данных не знает, что делать с состоянием. В группе только один город, но штатов много. Все они не могут быть выведены в виде значения без какой-либо функции агрегирования.
  • Мы не можем использовать предложение WHERE после предложения GROUP BY. В этом случае мы используем предложение HAVING.

  • Чтобы отобразить записи в определенном порядке (по возрастанию или по убыванию), мы можем использовать предложение ORDER BY. Но пользоваться им не обязательно.

Синтаксис:

SELECT column1, column2..., 
Aggregate(column3, column4,..) 
FROM Table_name WHERE Condition...
//OPTION-1 (depending on the condition) 
GROUP BY column1,column2,.. HAVING Condition...
//OPTION-2 (depending on the condition) 
ORDER BY column1,column2,.. DESC(if required); 

Здесь мы используем Microsoft SQL Server для выполнения запросов.

Шаг 1: Создание базы данных

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

Запрос:

CREATE DATABASE Sales;                                             

Шаг 2: Использование базы данных

Используйте следующую инструкцию SQL, чтобы переключить контекст базы данных на Sales:

Запрос:

USE Sales;

Шаг 3: Определение таблицы

Мы собираемся использовать следующую таблицу Sales_Order в нашей базе данных продаж.

Запрос:

Create Table Sales_Order
(ORDERNO VARCHAR(20) Primary Key, 
ClientNo VARCHAR(20),
Orderdate DATE,
SALESMANNO VARCHAR(20),
Oredrstatus VARCHAR(30)0;

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

Запрос:

EXEC SP_COLUMNS Sales_Order;

Выход:

Шаг 4: Добавление данных в таблицу

Используйте приведенный ниже оператор, чтобы добавить данные в таблицу Sales_Order :

Запрос:

INSERT INTO Sales_Order VALUES
("O19001", "C00001", "2007-10-03", "S00001", "In Process"); 
INSERT INTO Sales_Order VALUES("O19002", "C00002", "2007-11-01", "S00002", "Cancelled");
INSERT INTO Sales_Order VALUES("O19003", "C00003", "2007-9-05", "S00003", "Fulfilled");
INSERT INTO Sales_Order VALUES("O19004", "C00004", "2007-6-06", "S00004", "Fulfilled"); 
INSERT INTO Sales_Order VALUES("O19005", "C00005", "2007-8-02", "S00005", "Cancelled");
INSERT INTO Sales_Order VALUES("O19006", "C00006", "2007-8-01", "S00006", "In Process"); 

Шаг 5: Просмотр вставленных данных

Запрос:

SELECT * FROM Sales_Order; 

Шаг 6: Предположим, мы хотим узнать Client-no из клиентов, заказы которых находятся в обработке.

Для этого воспользуемся функцией COUNT() :

Запрос:

SELECT CLIENTNO, COUNT(ORDERSTATUS)
AS Order_In_Process
from Sales_Order WHERE 
ORDERSTATUS="In Process" GROUP BY CLIENTNO; 

Запустите эту команду на своем компьютере и посмотрите результат.

Выход:

Итак, из этого вывода мы можем легко сказать, что у C00001 и C00006 есть 1 заказ, все еще In_Process .

Пример 2:

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

Запрос:

Create Table Ordered place VARCHAR(30), product VARCHAR(30), price DECIMAL);

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

На этот раз мы хотим узнать общую сумму денег, заработанную в обоих местах.

Для этого воспользуемся функцией SUM() :

Запрос:

SELECT place, SUM(price) FROM ORDERED GROUP BY place; 

Выход:

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

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