|
Страница 1 из 3 Агрегирование данных в SQL запросах SQL-функции В SQL существует ряд специальных стандартных функций (SQL-функций). Кроме специального случая COUNT(*) каждая из этих функций оперирует совокупностью значений столбца некоторой таблицы и создает единственное значение, определяемое так: COUNT- число значений в столбце, SUM- сумма значений в столбце, AVG- среднее значение в столбце, MAX- самое большое значение в столбце, MIN- самое малое значение в столбце.
Для функций SUM и AVG рассматриваемый столбец должен содержать числовые значения.Следует отметить, что здесь столбец - это столбец виртуальной таблицы, в которой могут содержаться данные не только из столбца базовой таблицы, но и данные, полученные путем функционального преобразования и (или) связывания символами арифметических операций значений из одного или нескольких столбцов. При этом выражение, определяющее столбец такой таблицы, может быть сколь угодно сложным, но не должно содержать SQL-функций (вложенность SQL-функций не допускается). Однако из SQL-функций можно составлять любые выражения. Аргументу всех функций, кроме COUNT(*), может предшествовать ключевое слово DISTINCT (различный), указывающее, что избыточные дублирующие значения должны быть исключены перед тем, как будет применяться функция. Специальная же функция COUNT(*) служит для подсчета всех без исключения строк в таблице (включая дубликаты).Функции без использования фразы GROUP BY Если не используется фраза GROUP BY, то в перечень элементов_SELECT можно включать лишь SQL-функции или выражения, содержащие такие функции. Другими словами, нельзя иметь в списке столбцы, не являющихся аргументами SQL-функций. Например, выдать данные о массе лука (ПР=10), проданного поставщиками, и указать количество этих поставщиков: Результат: SELECT SUM(К_во),COUNT(К_во) FROM Поставки WHERE ПР = 10; SUM(К_во) COUNT(К_во) 220 2 Если бы для вывода в результат еще и номера продукта был сформирован запрос SELECT ПР,SUM(К_во),COUNT(К_во) FROM Поставки WHERE ПР = 10; то было бы получено сообщение об ошибке. Это связано с тем, что SQL-функция создает единственное значение из множества значений столбца-аргумента, а для "свободного" столбца должно быть выдано все множество его значений. Без специального указания (оно задается фразой GROUP BY) SQL не будет выяснять, одинаковы значения этого множества (как в данном примере, где ПР=10) или различны (как было бы при отсутствии WHERE фразы). Поэтому подобный запрос отвергается системой. Правда, никто не запрещает дать запрос SELECT 'Кол-во лука =',SUM(К_во),COUNT(К_во) FROM Поставки WHERE ПР = 10; Результат: 'Кол-во лука =' SUM(К_во) COUNT(К_во) Кол-во лука = 220 2 Отметим также, что в столбце-аргументе перед применением любой функции, кроме COUNT(*), исключаются все неопределенные значения. Если оказывается, что аргумент - пустое множество, функция COUNT принимает значение 0, а остальные - NULL. Например, для получения суммы цен, средней цены, количества поставляемых продуктов и количества разных цен продуктов, проданных коопторгом УРОЖАЙ (ПС=5), а также для получения количества продуктов, которые могут поставляться этим коопторгом, можно дать запрос SELECT SUM(Цена),AVG(Цена),COUNT(Цена), COUNT(DISTINCT Цена),COUNT(*) FROM Поставки WHERE ПС = 5; и получить (*) SUM(Цена) AVG(Цена) COUNT(Цена) COUNT(DISTINCT Цена) COUNT 6.2 1.24 5 4 7 В другом примере, где надо узнать "Сколько поставлено моркови и сколько поставщиков ее поставляют?": SELECT SUM(К_во),COUNT(К_во) FROM Поставки WHER ПР = 2; будет получен ответ: SUM(К_во) COUNT (К_во) -0- 0 Наконец, попробуем получить сумму массы поставленного лука с его средней ценой ("Сапоги с яичницей"): Результат: SELECT (SUM(К_во) +AVG(Цена)) FROM Поставки WHERE ПР = 10; SUM(К_во)+AVG(Цена) 220.6
|