- •Часть 2
- •Часть 2
- •Содержание
- •1. Конструктор запросов 4
- •2. Запрос на выборку. 13
- •1. Конструктор запросов
- •Создание выражений с помощью Построителя выражений
- •2. Запрос на выборку.
- •2.1. Запрос, основанный на одной таблице и использующий простое условие
- •2.2. Простая выборка из двух связанных таблиц.
- •2.3. Запрос, использующий вычисляемые поля
- •2.4. Запрос с группировкой
- •2.5. Запрос, использующий связь таблицы с самой собой (рекурсивное соединение)
- •2.6. Запрос, использующий две ссылки на одну таблицу
- •2.7. Выборка повторяющихся записей
- •2.8. Поиск несовпадающих записей
- •2.9. Другие сведения, полезные при разработке запросов
- •3. Запрос на удаление записей.
- •3.1. Запрос на удаление всех записей из таблицы (очистка таблицы)
- •3.2. Запрос на удаление с ограничением числа удаляемых записей
- •3.3. Запрос на удаление с применением внешнего объединения таблиц
- •4. Запрос на добавление записей в существующую таблицу
- •4.1. Запрос на добавление записей во временную таблицу текущей базы данных
- •4.2. Запрос на добавление записей во временную таблицу внешней базы данных
- •5. Запрос на обновление записей в таблице.
- •5.1. Простой запрос на обновление записей
- •5.2. Запрос на обновление полей нескольких связанных таблиц.
- •6. Запросы на объединение.
- •6.1. Запрос на объединение, связывающий воедино однотипные таблицы из различных баз данных.
- •7. Перекрестные запросы
- •7.1. Создание перекрестного запроса при помощи мастера
- •7.2. Сознание перекрестного запроса при помощи конструктора запросов
- •8. Запросы с параметрами
- •9. Подчиненные запросы
- •9.1. Использование подчиненных запросов в выражениях для условий отбора записей
- •9.2. Использование подчиненных запросов в определении полей основного запроса.
- •10. Свойства полей запросов
- •11. Свойства запросов
2.4. Запрос с группировкой
Допустим, необходимо создать выборку, содержащую наименование клиента, общее количество размещенных у него в 1998 году заказов, среднюю стоимость заказа и полную стоимость всех заказов. Записи в результирующем наборе данных должны быть расположены в порядке убывания полной стоимости заказов.
Для решения поставленной задачи добавьте в новый запрос таблицы Заказано, Заказы и Клиенты. Конструктор запросов автоматически проставит постоянные связи, существующие между этими таблицами на уровне базы данных. В бланк запроса перенесите поле Название из таблицы Клиенты и поле КодЗаказа из таблицы Заказы. В определения следующих двух полей бланка запросов введите одну и ту же строку: ССиr([Цена]*[Количество]*(1-[Скидка])/100). Последним добавьте поле Дата Размещения из таблицы Заказы. Для того чтобы воспользоваться возможностями группировки, нужно нажать на панели инструментов кнопку Групповые операции (кнопка с изображением греческой буквы ∑). В бланке запроса появится строка с названием Групповая операция, для каждого поля в котором указано значение Группировка. Измените эти значения для второго поля на значение Count, для третьего — на Avg, для четвертого — на Sum, после чего присвойте полям новые имена — Количество заказов, Средняя стоимость и Полная стоимость. Для поля ДатаРазмещения значение группировка необходимо заменить на Условие (после чего конструктор автоматически снимет флажок Вывод на экран ) и в строке Условие отбора ввести следующую строку: Between #01.01.98# And #31.12.98#. Последнее, что нужно сделать — указать для поля Полная стоимость порядок сортировки по убыванию. Получившийся запрос представлен на рис. 2.4.
|
|
Р
ис.
2.4.
Запрос с группировкой
Пояснения
а). Операция Группировка предназначена для объединения записей, имеющих одинаковые значения в группируемых полях, в одну запись. Для полей, у которых указана статистическая функция (Sum, Count и т.д.), производятся соответствующие вычисления. В нашем примере операция группировка указана для поля Название. Это значит, что из всех записей таблицы Клиенты, удовлетворяющих условию по полю Дата Размещения, в результирующий набор данных войдет только одна запись для каждого клиента. При этом поле Количество заказов будет содержать количество записей, соответствующих конкретному клиенту в таблице Заказы. Например, если для какого-либо из клиентов в течение 1998 года было выписано 12 счетов, то в поле Количество заказов, соответствующих данному клиенту, будет отображено значение 12. Точно так же в полях Средняя стоимость и Полная стоимость — будут вычислены среднее значение и сумма стоимости всех заказов по каждому клиенту. Описание статистических функций SQL приведено в таблице 2.4.
б). В таблице 2.3 перечислены все возможные значения свойства групповые операции.
Таблица 2.3. Возможные значения свойства Групповые операции.
Функция |
Комментарий |
Группировка |
Указывается для полей, по совпадающим значениям которых происходит объединение записей в одну. |
Выражение |
Указывается для вычисляемых полей. |
Условие |
Указывается для полей, которые не должны попасть в результирующий набор данных, но по которым проверяется условие. Условие для такого поля проверяется до выполнения операции группирования. Если для поля ввести условие и в поле. Групповые операции указать группировка, то условие будет проверяться уже после группировки. Для первого случая в операторе SQL используется предложение WHERE, a для второго — HAVING. |
Таблица 2.4. Статистические функции.
Функция |
Описание |
Sum |
Возвращает сумму значений, содержащихся в заданном поле запроса в записях, группируемых в одну. Синтаксис: Sит(выражение). Аргумент выражение может содержать либо название поля, либо выражение, выполняющее какие-либо вычисления. Выражение может включать имена полей, константы и функции. Функции могут быть определяемыми пользователем (в модуле), но не могут быть другими статистическими функциями. Функция Sum пропускает записи со значением Null в данном поле. |
Avg |
Вычисляет арифметическое среднее набора чисел, содержащихся в указанном поле запроса в записях, входящих в одну группировку. Синтаксис: Avg(выpaжeнue). Замечания относительно аргумента выражение и полей со значением Null те же, что и для функции Sum. |
Min, Max |
Возвращают соответственно минимальное и максимальное значения из набора значений, содержащихся в указанном поле запроса в пределах одной группировки. Синтаксис: Мin(выражение), Мах(выражение). Замечания — те же. |
Count |
Возвращает количество записей, объединяемых в одну при группировке. Синтаксис: Соиnt(выражение). Выражение может быть таким же, как и для выше описанных статистических функций. Функция Count, так же как и остальные функции, не подсчитывает записи, содержащие Null в полях, указанных в выражении. Поэтому, чтобы избежать глупых ошибок, нужно указывать либо обязательные для ввода поля (которые гарантированно будут содержать какое-либо значение — например, первичный ключ), либо подстановочный знак звездочки (например, Count(*)). |
StDev |
Вычисляет величину смещенного стандартного отклонения по набору значений, содержащихся в указанном поле запроса для каждой группировки. Синтаксис: StDev(выраженue). Замечания по поводу выражения и полей со значением Null те же, что и для функции Sum. Кроме того, если группировка содержит меньше двух записей, то функция возвращает значение Null, что означает невозможность вычисления стандартного отклонения. Стандартное отклонение (среднеквадратичное отклонение) — параметр, который указывает величину разброса функции распределения около среднего значения. Он равен квадратному корню из момента для квадрата отклонений от среднего. |
Var |
Возвращает значение смещенной дисперсии, вычисляемой по набору значений, содержащихся в указанном поле запроса для каждой группировки. Синтаксис: Var(выражение). Замечания по поводу выражения и полей со значением Null те же, что и для функции Sum. Если группировка содержит меньше двух записей, функция возвращает значение Null, что означает невозможность вычисления дисперсии. Дисперсия — квадрат значения среднеквадратичного отклонения, мера отличия значений в группе от среднего. |
First, Last |
Возвращают значение поля соответственно из первой и последней записи набора записей в пределах каждой группировки. Синтаксис: First(выражение), Last(выражение). Выражение — такое же, как и для остальных статистических функций. Поскольку записи обычно возвращаются без какого-либо специального порядка (кроме случаев, когда запрос содержит предложение ORDER BY), эти функции возвращают случайные данные |
в). Следует обратить внимание на то, что хотя для полей Средняя стоимость и Полная стоимость были указаны групповые операции Avg и Sum соответственно, после сохранения запроса конструктор подставил названия этих функций непосредственно в определение полей, а значение групповой операции изменил на Выражение. В то же самое время, поле Количество заказов осталось без изменений, поскольку в качестве выражения для функции Count указано просто имя соответствующего поля таблицы.
г). При вычислении полей Средняя стоимость и Полная стоимость использовалась функция ССиr, являющаяся одной из функций преобразования типов. Хотя чаще эти функции используются при программировании на Visual Basic, в запросах тоже иногда приходится их использовать. Чаще всего эти функции используются в вычисляемых полях запросов. Например, если из таблицы в запрос добавить поля Количество и Стоимость, а потом добавить вычисляемое поле Цена:[Стоимость]/[Количество], то в результирующем наборе данных в этом поле появятся значения, содержащие огромное количество знаков дробной части.
