>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 | 2 |
Функция 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 |
9 | 4 |
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, т.е. количество товаров в заказах всех клиентов.