Шаг 31 - Снова SELECT - Применение агрегатных функций

Продолжим изыскания в области оператора SELECT, ну не деться от него никуда, такова жизнь и больше никакова! :) Итак, основные виды мы уже разобрали. Остается подведение итогов по столбцам таблиц, а именно правильно - "агрегатные функции". Агрегатные (или их еще называют СТАТИЧЕСКИЕ) функции, позволяют подводить промежуточные итоги оперируя числовыми или иного вида исчислимыми столбцами. Агрегатная функция принимает в качестве аргумента столбец таблицы целиком и возвращает одно значение. Например, агрегатная функция AVG() принимает столбец и вычисляет среднее значение всех чисел находящихся в столбце. То есть, берет все записи этого столбца, складывает все числа в этом столбце, а потом делит полученное на количество слагаемых (вспомнили школьный курс математики)!

Например, дадим такой запрос: Каковы средний плановый и средний фактический объем продаж в вашей компании?

SELECT AVG(QUOTA), AVG(SALES)
	FROM SALESREPS
/

Получаем:

SQL> SELECT AVG(QUOTA), AVG(SALES)
  2  	FROM SALESREPS
  3  /

AVG(QUOTA) AVG(SALES)
---------- ----------
318,181818 298,143090

Два, столбца и одна строка, а вот так это выглядит графически:

31_1.gif (9566 b)

Надеюсь понятно, для начала? Давайте рассмотрим эти функции более внимательно, благо, их не так много:

А вот, так это выглядит в представлении синтаксиса команд:

-- SUM ------------- ( --- выражение ---------------- )  ----------------------
					   -- DISTINCT -- имя столбца --- 	

-- AVG ------------- ( --- выражение ---------------- )  ----------------------
					   -- DISTINCT -- имя столбца --- 
					   					   
-- MIN ------------- ( выражение )  -------------------------------------------

-- MAX ------------- ( выражение )  -------------------------------------------

-- COUNT ------------- ( --------------------- имя столбца )  -----------------
					     -- DISTINCT --
-- COUNT(*) -------------------------------------------------------------------

Аргументом агрегирования может служить не только имя столбца, но и любое математическое выражение. Например, как в следующем запросе: Каков средний процент выполнения плана в вашей компании?

SELECT AVG(100 * (SALES/QUOTA))
	FROM SALESREPS
/

Получаем:

SQL> SELECT AVG(100 * (SALES/QUOTA))
  2  	FROM SALESREPS
  3  /

AVG(100*(SALES/QUOTA))
----------------------
      94,4461905745769

А можно и так: Каков средний процент выполнения плана в вашей компании?

SELECT AVG(100 * (SALES/QUOTA)) PROCENT
	FROM SALESREPS
/

SQL> SELECT AVG(100 * (SALES/QUOTA)) PROCENT
  2  	FROM SALESREPS
  3  /

   PROCENT
----------
94,4461905

В данном случае, более осмысленное имя столбца результата, хоть это не главное. Идем дальше. Давайте попробуем вычислять суммы столбцов. Применяем функцию SUM(), не забывайте, что столбец должен быть числовым! Например, вот так: Каковы средний плановый и средний фактический объемы продаж, служащих нашей компании?

SELECT SUM(QUOTA), SUM(SALES)
	FROM SALESREPS
/

Получаем:

SQL> SELECT SUM(QUOTA), SUM(SALES)
  2  	FROM SALESREPS
  3  /

SUM(QUOTA) SUM(SALES)
---------- ----------
      3500   3279,574

Еще: Какова сумма всех заказов принятых Димой Маликовым?

SELECT SUM(AMOUNT)
	FROM ORDERS, SALESREPS
	WHERE NAME = 'Дима Маликов'
	AND REP = EMPL_NUM
/

Получаем:

SQL> SELECT SUM(AMOUNT)
  2  	FROM ORDERS, SALESREPS
  3  	WHERE NAME = 'Дима Маликов'
  4  	AND REP = EMPL_NUM
  5  /

SUM(AMOUNT)
-----------
     602,44

Да, рванул парень! :)))) Давайте, приведем еще несколько простых примеров с функцией агрегирования AVG(). Например такие: Вычислить среднюю цену товаров от производителя "ACI".

SELECT AVG(PRICE)
	FROM PRODUCTS
	WHERE MFR_ID = 'ACI'
/

Получаем:

SQL> SELECT AVG(PRICE)
  2  	FROM PRODUCTS
  3  	WHERE MFR_ID = 'ACI'
  4  /

AVG(PRICE)
----------
411,821428

Вычислить среднюю стоимость заказа, размещенного компанией "Acme Mfg". (идентификатор клиента 2103)

SELECT AVG(AMOUNT)
	FROM ORDERS
	WHERE CUST = 2103
/

Получаем:

SQL> SELECT AVG(AMOUNT)
  2  	FROM ORDERS
  3  	WHERE CUST = 2103
  4  /

AVG(AMOUNT)
-----------
     184,22

Для начала я думаю достаточно, можете пока поэкспериментировать самостоятельно с нашими учебными таблицами.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 21.09.2003