Как сгруппировать и агрегировать данные с помощью SQL?
В таблице базы данных может быть много столбцов, поэтому иногда может быть сложно и долго искать данные одного типа в этих столбцах. Оператор 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 и делать различные запросы, подобные этим.