На этом шаге мы перейдем к использованию агрегатных функций, которые берут группы значений и сводят их к одиночному значению.
SQL Server предоставляет несколько агрегатных функций:
SELECT SUM( amt ) FROM OrdersРезультат:
--------------------- 26658.4000
Функция COUNT несколько отличается от остальных. Она подсчитывает число значений в данной колонке или число строк в таблице. Например подсчитаем количество номеров торговых агентов, вписанных в таблицу Orders
SELECT COUNT( DISTINCT snum ) FROM OrdersРезультат:
----------- 5Обратите внимание, что в приведенном выше примере используется ключевое слово DISTINCT - это означает что подсчитываться будет количество уникальных значений в колонке snum таблицы Orders. Если опустить его результат изменится:
----------- 10
SELECT COUNT(*) FROM CustomersРезультат:
----------- 7
Предложение GROUP BY позволяет задавать Вам подмножество значений, для которых применяется агрегатная функция. Это дает возможность объединять поля и агрегатные функции в одном предложении SELECT. Предположим, что Вам надо найти наибольшую сумму заказа, полученного каждым торговым агентом.
SELECT snum, MAX( amt ) FROM Orders GROUP BY snumВывод этого запроса:
snum ----- ---------- 1001 9891.8800 1002 5160.4500 1003 1713.2300 1004 1900.1000 1007 1098.1600
SELECT snum, odate, MAX( amt ) FROM Orders GROUP BY snum, odateТ.е. мы выбираем коды агентов и максимальные суммы полученных ими заказов на каждую дату:
snum odate ----- ------------------------ ---------- 1001 1999-10-03 00:00:00.000 767.1900 1001 1999-10-05 00:00:00.000 4723.0000 1001 1999-10-06 00:00:00.000 9891.8800 1002 1999-10-03 00:00:00.000 5160.4500 1002 1999-10-04 00:00:00.000 75.7500 1002 1999-10-06 00:00:00.000 1309.9500 1003 1999-10-04 00:00:00.000 1713.2300 1004 1999-10-03 00:00:00.000 1900.1000 1007 1999-10-03 00:00:00.000 1098.1600Разумеется дни, в которые не было заказов не будут показаны.
Усложним задачу: теперь надо получить максимальную сумму заказов каждого агента, которая больше 3000. Для достижения такого эффекта применяется предложение HAVING, которое определяет критерий, используемый для удаления групп из результата запроса, как это делает предложение WHERE для отдельных строк. Вот как это делается:
SELECT snum, odate, MAX( amt ) FROM ORDERS GROUP BY snum, odate HAVING MAX( amt ) > 3000
snum odate ----- ------------------------ ---------- 1002 1999-10-03 00:00:00.000 5160.4500 1001 1999-10-05 00:00:00.000 4723.0000 1001 1999-10-06 00:00:00.000 9891.8800
Агрегатные функции позволяют не просто выбирать определенные значения из БД, но и производить их обобщение и анализ. Далее мы познакомимся с техникой выборки данных из нескольких таблиц.