Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФОРМАТИРОВАНИЕ СВОДНОЙ ТАБЛИЦЫ.docx
Скачиваний:
8
Добавлен:
12.04.2015
Размер:
188.49 Кб
Скачать

Ограничение для групп данных

Ранее для ограничения диапазона данных в выборке был рас­смотрен оператор WHERE. Однако он накладывает ограничения на каждую строку данных в отдельности. Для наложения ограниче­ния на группы данных служит предложение HAVING, которое ис­пользуется совместно с оператором GROUP BY и имеет следую­щий синтаксис:

SELECT selectionjist FROM table_name [GROUP BY group_list]

[HAVING condition [,...n]];

где condition - одно либо несколько условий ограничения, на­лагаемых на группы данных, образующиеся в результате работы предложения GROUP BY.

Предложение HAVING применяется ко всему запросу в целом уже после того, как в запросе будут вычислены все группы и функции. Порядок выполнения операторов в предложении SE­LECT выглядит следующим образом:

  1. Выбор необходимых строк при помощи оператора WHERE.

  2. Разделение выбранных строк на отдельные группы предложе­нием GROUP BY.

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

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

Например, на основании данных таблицы tbIGoods требуется вычислить для каждого товара количество его моделей, у кото­рых цена не дешевле 600 р. (поле fPriceGoods), а количество еди­ниц превышает 50 штук (поле fQuantityGoods).

Для решения этой задачи составим следующий запрос:

SELECT fNameGoods AS Товар, COUNT (fModelGoods) AS

Моделей, SUM(fQuantityGoods) AS Единиц

FROM tbIGoods

WHERE fPriceGoods >= 600

GROUP BY fNameGoods

HAVING SUM(fQuantityGoods) > 50

ORDER BY 3;

Пошагово разберем порядок выполнения запроса.

Вначале выполняется выборка данных согласно тому ограни­чению, которое накладывается неравенством, указанным в пред­ложении WHERE. Запрос на этом этапе можно представить в сле­дующем виде:

SELECT fNameGoods AS Товар, fModelGoods AS Моделей,

fQuantityGoods AS Единиц

FROM tbIGoods

WHERE fPriceGoods >= 600;

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

SELECT fNameGoods AS Товар, COUNT(fModelGoods) AS Моделей, SUM(fQuantityGoods) AS Единиц

FROM tbIGoods

WHERE fPriceGoods >= 600

GROUP BY fNameGoods;

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

SELECT fNameGoods AS Товар, COUNT(fModelGoods) AS

Моделей, SUM(fQuantityGoods) AS Единиц

FROM tbIGoods

WHERE fPriceGoods >= 600

GROUP BY fNameGoods •

HAVING SUM(fQuantityGoods) > 50;

На последнем этапе выполняется оператор сортировки полу­ченного результата по третьему полю (SUM(fQuantityGoods) AS Единиц) в порядке возрастания, т.е. добавляется предложение ORDER BY 3.

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