Цель: научить
использовать агрегатные функции и
раздел GROUP BY оператора SELECT для аналитической
выборки данных.
Задание 1.
Вычислить среднюю цену товаров.
Для вычисления
средней цены необходимо воспользоваться
агрегатной функцией AVG.
Агрегатная функция
объединит значения поля ListPrice,
так что следующий код вернет только
одно число (рис. 8.1):
SELECT
AVG(ListPrice) FROM Production.Product
Задание 2.
Определить имена заказчиков, разместивших
заказы в последний учетный день.
Для простоты
сначала получим список только CustomerID,
а не имен заказчиков. Для этого можно
воспользоваться следующим запросом:
Select
CustomerID From Sales.SalesOrderHeader
Where
OrderDate=(SELECT Max(OrderDate) From Sales. SalesOrderHeader)
Для полного
решения задачи выберем имена всех
заказчиков из таблицы Person,
которые присутствуют в списке, полученном
в предыдущем пункте. Однако таблица
Person
не содержит поля CustomerID,
поэтому придется еще соединить ее с
таблицей Customer.
Результирующий код будет выглядеть
следующим образом:
SELECT
FirstName + ' ' + LastName AS 'CustomerName'
FROM
Person.Person
INNER
JOIN Sales.Customer ON Customer.PersonID = Person.BusinessEntityID
WHERE
CustomerID in
(SELECT
CustomerID FROM Sales.SalesOrderHeader
WHERE
OrderDate=(SELECT Max(OrderDate) FROM Sales. SalesOrderHeader))
Задание 3.
Определить список заказчиков, заказавших
за один раз более 300 единиц товара.
Для каждого заказа
нам требуется получить общее количество
товара, для этого потребуется составить
связанный подзапрос.
Для того чтобы
перед именами полей не писать каждый
раз полное название таблиц, удобно
воспользоваться псевдонимами. В данном
случае определим следующие псевдонимы:
для таблицы SalesOrderHeader
псевдоним oh,
а для SalesOrderDetail
– od.
Результирующий
код будет выглядеть следующим образом:
SELECT
SalesOrderID, CustomerID
FROM
Sales.SalesOrderHeader oh
WHERE
300<(SELECT sum(OrderQty)
FROM
Sales.SalesOrderDetail od WHERE od.SalesOrderID=oh.SalesOrderID)
Задание 4. Для
каждого товара отобразить сведения о
самом крупном его заказе: количество
заказанного товара и номер заказа. Для
выполнения задания необходимо
использовать внутреннее соединение
таблиц Product
и SalesOrderDetail,
а также связанный подзапрос, возвращающий
для каждого товара его максимальный
заказ.
В запросе нам
потребуется работа с таблицей
SalesOrderDetail
как во внешнем запросе, так и во
внутреннем связанном подзапросе.
Поэтому для данной таблицы мы создадим
два псевдонима: od1
и od2.
Результирующий
код будет выглядеть следующим образом: