БД_лабы(11 лаб, 5 семестр) / БД_ЛР2
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра Систем автоматизированного проектирования
отчет
по лабораторной работе №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
Использование оператора 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-го запроса
Использование оператора 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.
