×
Traktatov.net » Обработка баз данных на Visual Basic.NET » Читать онлайн
Страница 45 из 229 Настройки

>SELECT tblOrder.CustomerID, FirstName, LastName,

>COUNT(dbo.tblOrder.CustomerID) AS TotalOrders

>FROM tblOrder INNER JOIN tblCustomer

>ON tblOrder.CustomerID = tblCustomer.ID

>GROUP BY FirstName, LastName, CustomerID

>HAVING FirstName = 'Jane'

Этот запрос возвращает одну запись для клиента Jane Winters с указанием двух сделанных ею заказов. Допустим, теперь нужно получить список активных покупателей, т.е. клиентов, сделавших более одного заказа. Поскольку агрегированное количество заказов хранится в вычисленном поле TotalOrders, можно предположить, что для определения таких клиентов допустимо использовать выражение HAVING TotalOrders > 1. К сожалению, это выражение некорректно, так как TotalOrders – это не поле базы данных, а вычисленное поле. Вместо этого следует включить данное вычисление в предложение HAVING показанного ниже запроса.

>SELECT tblOrder.CustomerID, FirstName, LastName,

>COUNT(dbo.tblOrder.CustomerID) AS TotalOrders

>FROM tblOrder INNER JOIN tblCustomer

>ON tblOrder.CustomerID = tblCustomer.ID

>GROUP BY FirstName, LastName, CustomerID

>HAVING (COUNT(tblOrder.CustomerID) > 1)

После выполнения этого запроса будут получены три строки, каждая из которых содержит номер, имя, фамилию и количество заказов для каждого клиента, который сделал более одного заказа.

CustomerID FirstName LastName TotalOrders
1 John Smith 2
4 Daisy Klein 3
8 Jane Winters

Функция SUM

Ваши возможности в подведении итогов не ограничены простым подсчетом записей. Используя функцию SUM, можно генерировать итоговые результаты для всех возвращаемых записей по любым числовым полям. Например, для создания запроса, который генерирует итоги по количеству заказанных товаров каждым клиентом, необходимо написать следующую команду SQL:

>SELECT OrderID, SUM(Quantity) AS TotalItems

>FROM tblOrderItem

>GROUP BY OrderID

Этот запрос возвращает приведенный ниже результирующий набор.

OrderID TotalItems
1 6
2 2
3 1
4 23
5 4
6 13
7 12
8 3
94
10 4

Как и в предыдущих примерах группирования, если вы захотите извлечь дополнительную связанную информацию (например, имя и фамилию клиента), следует использовать объединение с другой таблицей. Помните, что для агрегирования данных потребуется сгруппировать данные по крайней мере по одному полю.

Перечень итоговых функций

В табл. 2.2 перечислены все итоговые функции, доступные в SQL.

Таблица 2.2. Итоговые функции SQL

Функция Результат
AVG Среднее значение от всех значений в столбце
COUNT Общее количество отобранных записей
MAX Максимальное (наибольшее) значение поля
MIN Минимальное (наименьшее) значение поля
STDEV Среднеквадратическое отклонение
SUM Общая сумма всех значений в поле
VAR Дисперсия

Синтаксис этих функций, по сути, соответствует синтаксису функции COUNT, которая рассматривалась в предыдущем разделе. Например, для ежедневного вычисления среднего количества товаров в каждом заказе воспользуйтесь приведенным ниже запросом SQL.

>SELECT AVG(tblOrderItem.Quantity) AS AverageLineItemQuantity

>FROM tblOrder INNER JOIN

>tblOrderItem ON tblOrder.ID = tblOrderItem.OrderID

Этот запрос возвращает значение 2, т.е. количество товаров в заказах всех клиентов.