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

Группировка и обобщение данных. Рекомендации по выполнению работы и перечень типовых заданий. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
870 Кб
Скачать

Пример 18

Рассчитать итоговую сумму товара в каждой линейке товара и для

каждого цвета, используя GROUPING SETS.

SELECT

"ProductLine"

,"Color"

,SUM("ListPrice") AS "Total" FROM "Production"."Product"

WHERE

"Color" IS NOT NULL

AND "ProductLine" IS NOT NULL

GROUP BY GROUPING SETS(("ProductLine"), ("Color"));

Рисунок 19 – Результат выполнения оператора GROUPING SETS.

Результат выполнения запроса (Пример 18)

21

GROUP BY ()

GROUP BY () Указывает пустую группу, что приводит к созданию общего итога. Он полезен в качестве одного из элементов GROUPING SET.

Пример 19

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

SELECT

"ProductLine"

,"Color"

,SUM("ListPrice") AS "Total" FROM "Production"."Product"

WHERE

"Color" IS NOT NULL

AND "ProductLine" IS NOT NULL

GROUP BY GROUPING SETS(("ProductLine"), ("Color"), ());

Рисунок 20 – Результат выполнения оператора GROUPING SETS

с общим подытогом (Пример 19).

22

Результаты двух запросов отличаются дополнительными скобками для

(Пример 19) в предложении GROUPING SETS. В результате выше (Рисунок 20)

первая строка содержит максимальную цену и среди всех цветов, и во всех вариантах линейки товара.

GROUPING

GROUPING используется, чтобы различать значения NULL, возвращаемые операторами ROLLUP, CUBE или GROUPING SETS, и стандартные значения

NULL. Возвращение NULL в качестве результата операции ROLLUP, CUBE или

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

В результирующем наборе функция GROUPING возвращает 1 (агрегатное выражение) или нуль (неагрегатное выражение). В качестве аргумента функции

GROUPING () должен быть столбец или выражение, которое содержит столбец в предложении GROUP BY.

Пример 20

Создать запрос, который показывает квоты продаж (SalesQuota) и

просуммированные продажи (SalesYTD) из таблицы Sales.SalesPerson,

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

SELECT

"SalesQuota"

,SUM("SalesYTD") AS "TotalSalesYTD"

,GROUPING("SalesQuota") AS "Grouping" FROM "Sales"."SalesPerson"

GROUP BY CUBE("SalesQuota");

23

Рисунок 21 – Результат выполнения запроса (Пример 20)

Выше (Рисунок 21) первая строка в столбце SalesQuota содержит значение NULL – соответствует сумме всех строк. Об этом сигнализирует значение 1 в столбце Grouping – к этой строке применялась агрегатная функция. Однако во второй строке значение NULL показывает, что значение во втором столбце соответствует пустой квоте продаж. Значение в последнем столбце содержит значение нуль, что означает, что к этой строке не применялась агрегатная функция.

Пример 21

Создать итоговый отчет, который показывает общее количество

(Quantity) каждого товара на каждой полке (Shelf) из таблицы

Production.ProductInventory с использованием операторов CUBE и GROUPING.

SELECT

"ProductID"

,"Shelf"

,SUM("Quantity") AS "TotalQuantity"

,GROUPING("Shelf") AS "ShelGrouping" FROM "Production"."ProductInventory" GROUP BY CUBE("ProductID", "Shelf");

24

Рисунок 22 – Результат выполнения запроса (Пример 21)

Функция Grouping применялась к полю Shelf (полка), поэтому значение

1 в последнем столбце означает общее количество соответствующего товара

(ProductID) на всех полках.

25

ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ

Вариант 1

1.Найти максимальную цену товара (ListPrice) из таблицы

Production.Product

2.Найти минимальный вес (Weight) из таблицы Production.Product,

не учитывать пустые значения.

3.Найти средний возраст мужчин и женщин из таблицы

HumanResources.Employee, не учитывать пустые значения.

4.Вывести сраны, где количество городов = 1, из таблицы

Person.StateProvince (из выборки исключить пустые поля).

5.Вывести цвет Color, ProductLine и максимальный размер Size

для каждого цвета Color с разными линиями ProductLine,

предусмотреть вывод общего максимального размера для всех цветов Color у различных ProductLine из таблицы

Production.Product. (Использовать ROOLUP). Отделить строки,

созданные с помощью агрегатных функций от строк из фактической таблицы.

6.Изменить запрос п.5 использовать CUBE. Отделить строки, созданные с помощью агрегатных функций от строк из фактической таблицы.

7.Изменить запрос п.5 использовать GROUPING SETS. Отделить строки,

созданные с помощью агрегатных функций от строк из фактической таблицы.

26

Вариант 2

1.Найти минимальную цену товара (ListPrice) из таблицы

Production.Product. Не учитывать нулевую цену.

2.Найти средний вес (Weight) из таблицы Production.Product, не учитывать пустые значения.

3.Для каждого пола (Gender) найти суммарное количество часов

отпуска из таблицы (поставить фильтр: работник был принят до 2008

года) HumanResources.Employee, не учитывать пустые значения.

4.Вывести пол, где среднее количество часов выходных больше 50 из таблицы HumanResources.Employee.

5.Вывести BusinessEntityID, LastReceiptDate и

максимальное значение LastReceiptCost для

BusinessEntityID с разными LastReceiptDate, предусмотреть

вывод общей суммы для всех LastReceiptCost у различных

BusinessEntityID из таблицы Purchasing.ProductVendor.

(Использовать ROOLUP).

6.Изменить запрос п.5 использовать CUBE. Отделить строки, созданные с помощью агрегатных функций от строк из фактической таблицы.

7.Изменить запрос п.5 использовать GROUPING SETS. Отделить строки,

созданные с помощью агрегатных функций от строк из фактической таблицы.

27

Вариант 3

1.Найти среднюю цену товара (ListPrice) из таблицы

Production.Product. Не учитывать нулевую цену.

2.Найти максимальный вес (Weight) товара черного цвета из таблицы Production.Product, не учитывать пустые и нулевые значения.

3.Для каждой профессии (JobTitle) найти суммарное количество человек, которые были приняты до 2009 года, из таблицы HumanResources.Employee, не учитывать пустые значения.

4.Найти количество номеров телефона разного типа

(PhoneNumberTypeID) из таблицы Person.PersonPhone, где номер начинается с 217. Показать тип, где номера телефонов встречаются больше 3 раз.

5.Вывести количество городов City, в каждой провинции

StateProvinceName и в каждой стране CountryRegionName,

предусмотреть вывод количества City в различных

StateProvinceName из таблицы

Purchasing.vVendorWithAddresses. (Использовать ROOLUP).

6.Изменить запрос п.5 использовать CUBE. Отделить строки, созданные с помощью агрегатных функций от строк из фактической таблицы.

7.Изменить запрос п.5 использовать GROUPING SETS. Отделить строки,

созданные с помощью агрегатных функций от строк из фактической таблицы.

28

Вариант 4

1.Найти суммарную цену товара (ListPrice) из таблицы

Production.Product.

2.Найти средний вес (Weight) товара красного цвета из таблицы

Production.Product, не учитывать пустые значения.

3.Для каждой профессии (JobTitle) найти количество человек,

которые были приняты позже 2010 года, из таблицы

HumanResources.Employee, не учитывать пустые значения.

4.Вывести типы (PhoneNumberTypeID) из таблицы

Person.PersonPhone, где в номере телефона данного типа первые три цифры совпадают с последними тремя и количество таких номеров телефонов больше 5.

5.Вывести ContactType, PhoneNumberType и количество типов контактов ContactType для PhoneNumberType с разными

ContactType, предусмотреть вывод количества ContactType у

различных PhoneNumberType из таблицы

Purchasing.vVendorWithContacts. (Использовать ROOLUP).

6.Изменить запрос п.5 использовать CUBE. Отделить строки, созданные с помощью агрегатных функций от строк из фактической таблицы.

7.Изменить запрос п.5 использовать GROUPING SETS. Отделить строки,

созданные с помощью агрегатных функций от строк из фактической таблицы.

29

Вариант 5

1.Показать количество разнообразных цветов товара (Color) из таблицы Production.Product.

2.Найти суммарную цену (ListPrice) товара размера M из таблицы

Production.Product, не учитывать пустые и нулевые значения.

3.Найти количество номеров телефона разного типа

(PhoneNumberTypeID) из таблицы Person.PersonPhone, где номер начинается с 819. Сортировать по возрастанию.

4.Вывести пол, где средний возраст больше 42 лет из таблицы

HumanResources.Employee (не учитывать пустые значения).

5.Вывести EmployeeID, ShipDate и среднее по SubTotal для всевозможных EmployeeID с одинаковой ShipDate, предусмотреть вывод общего среднего StandardPrice за ShipDate из таблицы

Purchasing.PurchaseOrderHeader. (Использовать ROLLUP).

6.Изменить запрос п.5 использовать CUBE. Отделить строки, созданные с помощью агрегатных функций от строк из фактической таблицы.

7.Изменить запрос п.5 использовать GROUPING SETS. Отделить строки,

созданные с помощью агрегатных функций от строк из фактической таблицы.

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]