Тарифы Услуги Сим-карты

Групповые операции в запросах Access. Язык SQL. Формирование запросов к базе данных. Справочные сведения об агрегатных функциях

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

Выберите нужное действие

Способы подсчета данных

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

    Сумма для суммирования столбцов чисел;

    Среднее для вычисления среднего значения в столбце чисел;

    Максимум для нахождения наибольшего значения в поле;

    Минимум для нахождения наименьшего значения в поле;

    Стандартное отклонение для оценки разброса значений относительно среднего значения;

    Дисперсия для вычисления статистической дисперсии всех значений в столбце.

В Access предусмотрено два способа добавления функции Count и других агрегатных функций в запрос. Вы можете:

    Открыть запрос в режиме таблицы и добавить строку итогов. Строка итогов позволяет использовать агрегатные функции в одном или нескольких столбцах в результатах запроса без необходимости изменять его структуру.

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

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

Дополнительные сведения о способах использования других агрегатных функций см. в разделе .

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

С другой стороны, многие агрегатные функции работают только с данными в полях, имеющих определенный тип данных. Например, функция Сумма работает только с типами данных "Число", "Действительное" и "Денежный". Дополнительные сведения о типах данных, требуемых для каждой функции, см. ниже в разделе .

Общие сведения о типах данных см. в статье Изменение типа данных для поля .

Подсчет данных с помощью строки итогов

Чтобы добавить в запрос строку итогов, откройте его в режиме таблицы, добавьте строку, а затем выберите функцию Число или другую агрегатную функцию, например Сумма , Минимум , Максимум или Среднее . В этом разделе объясняется, как создать простой запрос на выборку и добавить строку итогов.

Создание простого запроса на выборку

Добавление строки итогов

Скрытие строки итогов

    На вкладке Главная в группе Записи нажмите кнопку Итоги .

Дополнительные сведения об использовании строки итогов см. в разделе Отображение итогов по столбцу в таблице .

Подсчет данных с помощью итогового запроса

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

Как правило, итоговый запрос применяется вместо строки итогов тогда, когда требуется использовать значение результата в другой части базы данных, например в отчете.

Подсчет всех записей в запросе

Подсчет записей в группе или категории

Справочные сведения об агрегатных функциях

В следующей таблице перечислены и отписаны агрегатные функции Access, которые можно использовать в строке итогов и в запросах. Помните, что в Access предусмотрено больше агрегатных функций для запросов, чем для строки итогов. Кроме того, при работе с проектом Access (внешней базой данных Access, которая подключается к базе данных Microsoft SQL Server) можно использовать расширенный набор агрегатных функций, предоставляемый SQL Server. Дополнительные сведения о них см. в электронной документации Microsoft SQL Server.

Функция

Описание

Поддерживаемые типы данных

Сумма

Суммирует элементы в столбце. Подходит только для числовых и денежных данных.

Среднее

Вычисляет среднее значение для столбца. Столбец должен содержать числовые или денежные величины или значения даты или времени. Функция игнорирует пустые значения.

Число

Подсчитывает число элементов в столбце.

Все типы данных, за исключением сложных повторяющихся скалярных данных, таких как столбец многозначных списков.

Дополнительные сведения о многозначных списках можно найти в статье рекомендации по созданию и удалению многозначных полей в руководствах , посвященных многозначным полям.

Максимум

Возвращает элемент, имеющий наибольшее значение. Для текстовых данных наибольшим будет последнее по алфавиту значение, причем Access не учитывает регистр. Функция игнорирует пустые значения.

"Число", "Действительное", "Денежный", "Дата/время"

Минимум

Возвращает элемент, имеющий наименьшее значение. Для текстовых данных наименьшим будет первое по алфавиту значение, причем Access не учитывает регистр. Функция игнорирует пустые значения.

"Число", "Действительное", "Денежный", "Дата/время"

Стандартное отклонение

Показывает, насколько значения отклоняются от среднего.

Дополнительные сведения об этой функции см. в статье Отображение итогов по столбцу в таблице .

"Число", "Действительное", "Денежный"

Дисперсия

Вычисляет статистическую дисперсию для всех значений в столбце. Подходит только для числовых и денежных данных. Если таблица содержит менее двух строк, Access возвращает пустое значение.

Дополнительные сведения о функциях для расчета дисперсии см. в разделе Отображение итогов по столбцу в таблице .

"Число", "Действительное", "Денежный"

Группировка и агрегирование данных совершаются с помощью функций, определенных в MySQL. Опишем некоторые из них:

AVG (столбец) – средняя величина значений в указанном столбце

COUNT (столбец) – число ненулевых значений в указанном столбце. Если перед именем столбца указать DISTINCT , то выдается только количество неодинаковых значений;

MIN (столбец) – минимальное значение в столбце;

MAX (столбец) – максимальное значение в столбце;

SUM (столбец) – сумма значений в столбце.

Агрегатные функции можно использовать в запросе SELECT в качестве информации для вывода. Например, чтобы определить количество водителей в автопарке, можно подать запрос

mysql>SELECT COUNT (id) FROM drivers;

Чтобы узнать, сколько водителей работало за отчетное время, следует подать команду

mysql>SELECT COUNT (DISTINCT driver_number) FROM timetable;

Функция COUNT(*) определит число строк в таблице, но если указать COUNT(field) – определить число значений в поле field, то значения NULL в этом поле учтены не будут.

Предложение GROUP BY позволяет группировать записи, вошедшие в результаты запроса. Это дает возможность объединять поля и агрегатные функции в одном предложении SELECT.

Подсчитаем, сколько автомобилей имеется в таксопарке, сгруппировав данные по моделям:

mysql>SELECT model, COUNT(model) FROM cars GROUP by model;

Каждая группа состоит из строк с одинаковым значением поля model. результат этого запроса представлен ниже:

Таблицы – это неупорядоченные наборы данных, и выборка из них не обязательно получается в какой-то определенной последовательности. Для изменения порядка вывода результирующих данных используется конструкция ORDER BY.

Упорядочим сведения о водителях по дате рождения:

mysql>SELECT * FROM drivers ORDER BY birth;

В полученной выборке список откроют старшие водители. Если требуется упорядочить данные по убыванию, следует использовать ключевое слово DESC (от англ. Descending - по убыванию):

mysql>SELECT * FROM drivers ORDER BY birth DESC;

Конструкция LIMIT служит для указания, сколько строк результата следует отображать. Если нужно найти двух самых пожилых водителей, то можно применить команду



mysql>SELECT * FROM drivers ORDER BY birth LIMIT 2;

Можно также использовать два параметра: номер строки, с которой следует начать, и количество строк.

mysql>SELECT family_name From drivers LIMIT 2, 3 ;

Последний запрос можно интерпретировать так: "Выбрать фамилии водителей
и в результате отобразить три строки, начиная со строки 2". Нумерация строк начинается с нуля.

Запросы к двум и более таблицам

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

придется оперировать именами столбцов из разных таблиц. Следует учесть, что полное имя столбца состоит из имени базы данных, имени таблицы и собственно имени столбца, например, taxi. cars . color.

Часто имена таблиц заменяют короткими псевдонимами (alias), указывая их в запросе после ключевого слова from. Псевдонимы для таблиц являются стандартной частью языка SQL и обычно состоят из одной буквы. Задать псевдоним можно с помощью ключевого слова as:



mysql> SELECT color FROM cars AS c;

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

Между таблицами существуют связи по определенным столбцам. Столбец cars.id связывает таблицу cars с таблицей timetable через столбец timetable.car_number. Аналогично строится связь между таблицей drivers и timetable.

Объединение осуществляется по столбцам, образующим связь. При этом вы­бираются одинаковые значения полей, по которым осуществляется связь между таблицами:

timetable. car_number=cars . id

timetable. driver_number=drivers . id

Определим дату (данные из столбца timetable.use_on) и фамилию водителя (drivers.famiiy_name), который водил машину определенного цвета

mysql> SELECT t.use_on, d.family_name, c.color

-> FROM timetable AS t, cars AS c, drivers AS d

-> WHERE t.car_number=c.id AND t.driver_number=d.id;

Выборка данных происходит из таблиц timetable, cars и drivers, для кото­рых определены псевдонимы, сокращающие запись запроса и облегчающие его редактирование. Выбираются только те строки из таблиц timetable и cars, в которых указан одинаковый учетный номер автомобиля. А из таб­лиц timetable и drivers выбираются те строки, в которых значения учетного номера водителя одинаковы.

Команды обновления и удаления данных в таблицах

Если необходимо изменить значение поля, то следует использовать команду update. В команде нужно указать имя таблицы и использовать предложение set, определяющее требуемое изменение. Например, исправим дату выпуска автомобиля "Renault":

mysql>UPDATE cars SET madein="2004" WHERE model="Renault";

Можно изменить значения поля во всем столбце, например, при переоценке товаров. Увеличим цены на все товары на 10% с учетом инфляции:

mysql>UPDATE goods SET price = price * 1.1;

Удалить целые строки из таблицы можно с помощью команды delete. Уда­лим некоторые строки из таблицы cars в связи с продажей старых машин, изготовленных до 2006 г.:

mysql>DELETE FROM cars where madein<=2005;

Можно удалить и все записи из таблицы командой

mysql>DELETE FROM cars;

При этом счетчик автомобилей в столбце id не сбрасывается, и при вставке новых данных MySQL автоматически присвоит новой записи следующий номер.

Чтобы очистить таблицу и одновременно сбросить счетчик, нужно использовать команду

mysql>TRUNCATE cars;

Удалить таблицу можно командой drop table:

mysql>DROP TABLE timetable;

При этом нужно иметь права на удаление, а также учитывать, что удалить таб­лицу, имеющую первичный ключ, по которому осуществляется связь с дру­гой таблицей, MySQL не позволит, пока не удалена таблица с соответствую­щим внешним ключом. Удалить можно и всю базу целиком командой

по значению столбца Дисциплина . Мы получим 4 группы, для которых можем вычислить некоторые групповые значения, например количество кортежей в группе, максимальное или минимальное значение столбца Оценка . Таблица 5.7. Агрегатные функции
Функция Результат
COUNT Количество строк или непустых значений полей, которые выбрал запрос
SUM Сумма всех выбранных значений данного поля
AVG Среднеарифметическое значение всех выбранных значений данного поля
MIN Наименьшее из всех выбранных значений данного поля
MAX Наибольшее из всех выбранных значений данного поля
R1
ФИО Дисциплина Оценка
Группа 1 Петров Ф. И. Базы данных 5
Сидоров К. А. Базы данных 4
Миронов А. В. Базы данных 2
Степанова К. Е. Базы данных 2
Крылова Т. С. Базы данных 5
Владимиров В. А. Базы данных 5
Группа 2 Сидоров К. А. Теория информации 4
Степанова К. Е. Теория информации 2
Крылова Т. С. Теория информации 5
Миронов А. В. Теория информации Null
Группа 3 Трофимов П. А. Сети и телекоммуникации 4
Иванова Е. А. Сети и телекоммуникации 5
Уткина Н. В. Сети и телекоммуникации 5
Группа 4 Владимиров В. А. Английский язык 4
Трофимов П. А. Английский язык 5
Иванова Е. А. Английский язык 3
Петров Ф. И. Английский язык 5

Агрегатные функции используются подобно именам полей в операторе SELECT , но с одним исключением: они берут имя поля как аргумент . С функциями SUM и AVG могут использоваться только числовые поля. С функциями COUNT , MAX и MIN могут использоваться как числовые, так и символьные поля. При использовании с символьными полями MAX и MIN будут транслировать их в эквивалент ASCII кода и обрабатывать в алфавитном порядке. Некоторые СУБД позволяют использовать вложенные агрегаты, но это является отклонением от стандарта ANSI со всеми вытекающими отсюда последствиями.

Например, можно вычислить количество студентов, сдававших экзамены по каждой дисциплине. Для этого надо выполнить запрос с группировкой по полю "Дисциплина" и вывести в качестве результата название дисциплины и количество строк в группе по данной дисциплине. Применение символа * в качестве аргумента функции COUNT означает подсчет всех строк в группе.

SELECT R1.Дисциплина, COUNT(*) FROM R1 GROUP BY R1.Дисциплина

Результат:

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

Получим результат:

В этом случае строка со студентом

Миронов А. В. Теория информации Null

не попадет в набор кортежей перед группировкой, поэтому количество кортежей в группе для дисциплины " Теория информации " будет на 1 меньше.

Можно применять агрегатные функции также и без операции предварительной группировки, в этом случае все отношение рассматривается как одна группа и для этой группы можно вычислить одно значение на группу.

Обратившись снова к базе данных "Сессия" (таблицы R1, R2, R3 ), найдем количество успешно сданных экзаменов:

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

Результат:

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

Результат:

Мы не можем использовать агрегатные функции в предложении WHERE , потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции - в терминах групп строк.

Предложение GROUP BY позволяет определять подмножество значений в особом поле в терминах другого поля и применять функцию агрегата к подмножеству. Это дает возможность объединять поля и агрегатные функции в едином предложении SELECT . Агрегатные функции могут применяться как в выражении вывода результатов строки SELECT , так и в выражении условия обработки сформированных групп HAVING . В этом случае каждая агрегатная функция вычисляется для каждой выделенной группы. Значения, полученные при вычислении агрегатных функций , могут быть использованы для вывода соответствующих результатов или для условия отбора групп.

Построим запрос , который выводит группы, в которых по одной дисциплине на экзаменах получено больше одной двойки:

В дальнейшем в качестве примера будем работать не с БД "Сессия", а с БД "Банк", состоящей из одной таблицы F , в которой хранится отношение F, содержащее информацию о счетах в филиалах некоторого банка:

F = (N, ФИО, Филиал, ДатаОткрытия, ДатаЗакрытия, Остаток); Q = (Филиал, Город);

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

Например, предположим, что мы хотим найти суммарный остаток на счетах в филиалах. Можно сделать раздельный запрос для каждого из них, выбрав SUM(Остаток) из таблицы для каждого филиала. GROUP BY , однако, позволит поместить их все в одну команду:

SELECT Филиал, SUM(Остаток) FROM F GROUP BY Филиал;

GROUP BY применяет агрегатные функции независимо для каждой группы, определяемой с помощью значения поля Филиал. Группа состоит из строк с одинаковым значением поля Филиал, и

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

Например, сгруппируем отношение R1 по значению столбца Дисциплина . Мы получим 4 группы, для которых можем вычислить некоторые групповые значения, например количество кортежей в группе, максимальное или минимальное значение столбца Оценка .

Это делается с помощью агрегатных функций. Агрегатные функции вычисляют одиночное значение для всей группы таблицы. Список этих функций представлен в табл. 5.7.

Таблица 5.7. Агрегатные функции

Группа 1 ФИО Дисциплина Оценка
Петров Ф. И. Базы данных
Сидоров К. А. Базы данных
Миронов А. В. Базы данных
Степанова К. Е. Базы данных
Крылова Т. С. Базы данных
Владимиров В. А. Базы данных
Группа 2 Сидоров К. А. Теория информации
Степанова К. Е. Теория информации
Крылова Т. С. Теория информации
Миронов А. В. Теория информации Null
Группа3 Трофимов П. А. Сети и телекоммуникации
Иванова Е. А. Сети и телекоммуникации
Уткина Н. В. Сети и телекоммуникации
Группа 4 Владимиров В. А. Английский язык
Трофимов П. А. Английский язык
Иванова Е. А. Английский язык
Петров Ф. И. Английский язык

Агрегатные функции используются подобно именам полей в операторе SELECT, но с одним исключением: они берут имя поля как аргумент. С функциями SUM и AVG могут использоваться только числовые поля. С функциями COUNT, MAX и MIN могут использоваться как числовые, так и символьные поля. При использовании с символьными полями MAX и MIN будут транслировать их в эквивалент ASCII кода и обрабатывать в алфавитном порядке. Некоторые СУБД позволяют использовать вложенные агрегаты, но это является отклонением от стандарта ANSI со всеми вытекающими отсюда последствиями.

Например, можно вычислить количество студентов, сдававших экзамены по каждой дисциплине. Для этого надо выполнить запрос с группировкой по полю "Дисциплина" и вывести в качестве результата название дисциплины и количество строк в группе по данной дисциплине. Применение символа * в качестве аргумента функции COUNT означает подсчет всех строк в группе.

GROUP BY R1.Дисциплина

Результат:

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

SELECT R1.Дисциплина, COUNT(*)

WHERE R1.Оценка IS NOT NULL

GROUP BY R1.Дисциплина

Получим результат:

В этом случае строка со студентом

Миронов А. В. Теория информации Null

не попадет в набор кортежей перед группировкой, поэтому количество кортежей в группе для дисциплины "Теория информации" будет на 1 меньше.

Можно применять агрегатные функции также и без операции предварительной группировки, в этом случае все отношение рассматривается как одна группа и для этой группы можно вычислить одно значение на группу.

Обратившись снова к базе данных "Сессия" (таблицы R1, R2, R3), найдем количество успешно сданных экзаменов:

WHERE Оценка > 2;

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

SELECT R1.Дисциплина, COUNT(DISTINCT R1.Оценка)

WHERE R1.Оценка IS NOT NULL

GROUP BY R1.Дисциплина

Результат:

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

SELECT R1.Оценка, R1.Дисциплина, COUNT(*), AVR(Оценка)

WHERE R1.ФИО = R2.ФИО AND

R1.Оценка IS NOT NULL AND

R1.Оценка > 2

GROUP BY R1.Оценка R1.Дисциплина

Результат:

Мы не можем использовать агрегатные функции в предложении WHERE, потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции - в терминах групп строк.

Предложение GROUP BY позволяет определять подмножество значений в особом поле в терминах другого поля и применять функцию агрегата к подмножеству. Это дает возможность объединять поля и агрегатные функции в едином предложении SELECT. Агрегатные функции могут применяться как в выражении вывода результатов строки SELECT, так и в выражении условия обработки сформированных групп HAVING. В этом случае каждая агрегатная функция вычисляется для каждой выделенной группы. Значения, полученные при вычислении агрегатных функций, могут быть использованы для вывода соответствующих результатов или для условия отбора групп.

Построим запрос, который выводит группы, в которых по одной дисциплине на экзаменах получено больше одной двойки:

SELECT R2.Оценка

WHERE R1.ФИО = R2.ФИО AND

R1.Оценка = 2

GROUP BY R2.Оценка, R1.Дисциплина

HAVING count(*)> 1

В дальнейшем в качестве примера будем работать не с БД "Сессия", а с БД "Банк", состоящей из одной таблицы F, в которой хранится отношение F, содержащее информацию о счетах в филиалах некоторого банка:

F = (N, ФИО, Филиал, ДатаОткрытия, ДатаЗакрытия, Остаток);

Q = (Филиал, Город);

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

Например, предположим, что мы хотим найти суммарный остаток на счетах в филиалах. Можно сделать раздельный запрос для каждого из них, выбрав SUM(Остаток) из таблицы для каждого филиала. GROUP BY, однако, позволит поместить их все в одну команду:

SELECT Филиал, SUM(Остаток)

GROUP BY Филиал;

GROUP BY применяет агрегатные функции независимо для каждой группы, определяемой с помощью значения поля Филиал. Группа состоит из строк с одинаковым значением поля Филиал, и функция SUM применяется отдельно для каждой такой группы, то есть суммарный остаток на счетах подсчитывается отдельно для каждого филиала. Значение поля, к которому применяется GROUP BY, имеет, по определению, только одно значение на группу вывода, как и результат работы агрегатной функции. Поэтому мы можем совместить в одном запросе агрегат и поле. Вы можете также использовать GROUP BY с несколькими полями.

Предположим, что мы хотели бы увидеть только те суммарные значения остатков на счетах, которые превышают $5000. Чтобы увидеть суммарные остатки свыше $5000, необходимо использовать предложение HAVING. Предложение HAVING определяет критерии, используемые, чтобы удалять определенные группы из вывода, точно так же как предложение WHERE делает это для индивидуальных строк.

Правильной командой будет следующая:

SELECT Филиал, SUM(Остаток)

GROUP BY Филиал

HAVING SUM(Остаток) > 5000;

Аргументы в предложении HAVING подчиняются тем же самым правилам, что и в предложении SELECT, где используется GROUP BY. Они должны иметь одно значение на группу вывода.

Следующая команда будет запрещена:

SELECT Филиал,SUM(Остаток)

GROUP BY Филиал

HAVING ДатаОткрытия = 27/12/1999;

Поле ДатаОткрытия не может быть использовано в предложении HAVING, потому что оно может иметь больше чем одно значение на группу вывода. Чтобы избежать такой ситуации, предложение HAVING должно ссылаться только на агрегаты и поля, выбранные GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос:

SELECT Филиал,SUM(Остаток) FROM F

WHERE ДатаОткрытия = "27/12/1999" GROUP BY Филиал;

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

Как и говорилось ранее, HAVING может использовать только аргументы, которые имеют одно значение на группу вывода. Практически, ссылки на агрегатные функции - наиболее общие, но и поля, выбранные с помощью GROUP BY, также допустимы. Например, мы хотим увидеть суммарные остатки на счетах филиалов в Санкт-Петербурге, Пскове и Урюпинске:

SELECT Филиал, SUM(Остаток)

WHERE F.Филиал = Q.Филиал

GROUP BY Филиал

HAVING Город IN ("Санкт-Петербург", "Псков", "Урюпинск");

Поэтому в арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.

Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть TRUE. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.