Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
465.63 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра Систем автоматизированного проектирования

отчет

по лабораторной работе №2

по дисциплине «Базы Данных»

Тема: Группировка и агрегирование данных

Студенты гр. 3352

________________

Гареева К.Р.

________________

Жигунова О.М.

Преподаватель

________________

Горяинов С.В.

Санкт-Петербург

2025

Цель работы

Знакомство с опциями GROUP BY и HAVING, а также агрегированием данных.

Ход выполнения

Упражнение 1 – извлечение данных из БД

Запрос 1:

SELECT SalesPersonID, Bonus

FROM Sales.SalesPerson

ORDER BY Bonus DESC;

Данный запрос выводит таблицу с продавцами, у которых есть премия. Премия отсортирована по убыванию (рис. 1).

Рисунок 1 - Результат выполнения 1-го запроса

Запрос 2:

SELECT TOP 4 SalesPersonID, Bonus

FROM Sales.SalesPerson

ORDER BY Bonus DESC;

Возвращает только первые 4 записи после сортировки с помощью ключевого слова TOP (рис. 2).

Рисунок 2 - Результат выполнения 2-го запроса

Запрос 3:

SELECT TOP (4) WITH TIES SalesPersonID, Bonus

FROM Sales.SalesPerson

ORDER BY Bonus DESC;

Выводит 4 строки с максимальной премией и все строки, которые имеют то же значение сортировки, что и последняя выбранная при помощи WITH TIES (рис. 3).

Рисунок 3 - Результат выполнения 3-го запроса

Упражнение 2 - использование агрегатных функций и конструкций GROUP BY и HAVING

Запрос 4:

SELECT COUNT(*) AS TotalEmployees

FROM HumanResources.Employee;

Выводит общее количество сотрудников (рис. 4).

Рисунок 4 - Результат выполнения 4-го запроса

Запрос 5:

SELECT COUNT(*) AS EmployeesWithManagers

FROM HumanResources.Employee

WHERE ManagerID IS NOT NULL;

Выводит количество сотрудников, имеющих менеджеров, используя логическое выражение IS NOT NULL (рис. 5).

Рисунок 5 - Результат выполнения 5-го запроса

Запрос 6:

SELECT ProductID, SUM(OrderQty) AS TotalOrdered

FROM Sales.SalesOrderDetail

GROUP BY ProductID

Выводит суммарное количество заказанного товара для каждого продукта, используя агрегатную функцию SUM (рис. 6).

Рисунок 6 - Результат выполнения 6-го запроса

Запрос 7:

SELECT ProductID, SUM(OrderQty) AS TotalOrdered

FROM Sales.SalesOrderDetail

GROUP BY ProductID

ORDER BY TotalOrdered DESC;

Выводит суммарное количество заказанного товара для каждого продукта, отсортированное в порядке убывания при помощи DESC (рис. 7).

Рисунок 7 - Результат выполнения 7-го запроса

Запрос 8:

SELECT ProductID, SUM(OrderQty) AS TotalOrdered

FROM Sales.SalesOrderDetail

GROUP BY ProductID

HAVING SUM(OrderQty) >= 2000

ORDER BY TotalOrdered DESC;

Выводит ту же таблицу, но в выборку попадают только те товары, у которых общее количество заказов 2000 или больше, используя агрегатную функцию SUM и условие >= 2000 (рис. 8).

Рисунок 8 - Результат выполнения 8-го запроса

Запрос 9:

SELECT

ProductID,

SpecialOfferID,

AVG(UnitPrice) AS AvgPrice,

SUM(LineTotal) AS TotalLine

FROM Sales.SalesOrderDetail

GROUP BY ProductID, SpecialOfferID

ORDER BY ProductID ASC;

Выводит: идентификатор товара, идентификатор special offer, среднюю цену за единицу, общую сумму заказов по этой комбинации, сортирует по возрастанию. В запросе используются агрегатные функции AVG - среднее и SUM - сумма (рис. 9).

Рисунок 9 - Результат выполнения 9-го запроса

Упражнение 3 - использование ROLLUP и CUBE

  1. Использование оператора ROLLUP для создания сводных результатов

Запрос 10:

SELECT

SalesQuota,

SUM(SalesYTD) AS TotalSalesYTD

FROM Sales.SalesPerson

GROUP BY SalesQuota;

Выводит сгруппированный столбец salesquota с суммой salesytd в строковых полях напротив (рис. 10).

Рисунок 10 - Результат выполнения 10-го запроса

Запрос 11:

SELECT

SalesQuota,

SUM(SalesYTD) AS TotalSalesYTD

FROM Sales.SalesPerson

GROUP BY ROLLUP (SalesQuota);

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

Рисунок 11 - Результат выполнения 11-го запроса

Запрос 12:

SELECT

SalesQuota,

SUM(SalesYTD) AS TotalSalesYTD,

GROUPING(SalesQuota) AS IsTotal

FROM Sales.SalesPerson

GROUP BY ROLLUP (SalesQuota);

Возвращает для той же таблицы 1, если значение получено сводкой (NULL как итог) (рис. 12).

Рисунок 12 - Результат выполнения 12-го запроса

  1. Использование оператора CUBE для создания сводных результатов

Запрос 13:

SELECT

ProductID,

SUM(LineTotal) AS Total

FROM Sales.SalesOrderDetail

WHERE UnitPrice < 5.00

GROUP BY ProductID

ORDER BY ProductID;

Выводит таблицу, в которой productid сгруппирован и отсортирован по умолчанию в порядке возрастания, при этом в другом столбце мы суммируем только те linetotal, для которых unitprice < 5. Оператор CUBE создаёт все возможные комбинации группирующих столбцов (рис. 13).

Рисунок 13 - Результат выполнения 13-го запроса

Запрос 14:

SELECT

ProductID,

OrderQty,

SUM(LineTotal) AS Total,

GROUPING(ProductID) AS G_Product,

GROUPING(OrderQty) AS G_OrderQty

FROM Sales.SalesOrderDetail

WHERE UnitPrice < 5.00

GROUP BY CUBE (ProductID, OrderQty)

ORDER BY ProductID, OrderQty;

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

Рисунок 14 - Результат выполнения 14-го запроса

Запрос 15:

SELECT

SalesPersonID,

CustomerID,

OrderDate,

SubTotal,

TotalDue

FROM Sales.SalesOrderHeader

ORDER BY SalesPersonID, OrderDate;

Выводит таблицу, где показаны перечисленные столбцы, сортировка по столбцам salesrepsonid и orderdate в порядке возрастания (рис. 15).

Рисунок 15 - Результат выполнения 15-го запроса

Запрос 16:

SELECT

SalesPersonID,

SUM(SubTotal) AS TotalSub,

SUM(TotalDue) AS TotalDue

FROM Sales.SalesOrderHeader

GROUP BY SalesPersonID

ORDER BY SalesPersonID;

Вычисляет суммарное значение по двум полям. В новых версиях SQL вместо COMPUTE использовано GROUP BY (рис. 16).

Рисунок 16 - Результат выполнения 16-го запроса

Выводы

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

Соседние файлы в папке БД_лабы(11 лаб, 5 семестр)