
- •Технологии разработки программного обеспечения
- •Реляционное представление данных
- •Типы субд
- •Место и роль субд Microsoft Access®
- •Объекты
- •Особенности интерфейса
- •Режимы работы с бд
- •Порядок выполнения работы
- •Контрольные вопросы
- •Свойства полей. Обзор
- •Регистронезависимость Access
- •Свойства полей Тип данных и Размер поля
- •Приоритеты при разработке субд
- •Проектировочный режим: средства создания объектов
- •Эксплуатационный режим таблиц
- •Порядок выполнения работы
- •Варианты заданий
- •Контрольные вопросы
- •Реализация разделения данных. Ключевые поля
- •Вид связи один-к-одному
- •Вид связи один-ко-многим
- •Вид связи многие-ко-многим
- •Механизм создания ключей
- •Механизм подтаблиц
- •Порядок выполнения работы
- •Варианты заданий
- •Контрольные вопросы
- •Фильтры по выделенному
- •Запросы
- •Классификация запросов
- •Запросы на выборку
- •Отличия фильтров от запросов на выборку
- •Понятие предиката
- •Константы и переменные в запросах
- •Операторы в запросах
- •Бланк запроса в Access
- •Запросы с параметрами
- •Порядок выполнения работы
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Контрольные вопросы
- •Групповые операции
- •Запрос на обновление
- •Встроенные функции
- •Язык sql
- •Порядок выполнения работы
- •Вариант 10
- •Контрольные вопросы
- •Компилируемые и интерпретируемые языки программирования
- •Написание программы на языке Perl
- •Синтаксис языка Perl
- •Функции Perl
- •Порядок выполнения работы
- •Регулярные выражения
- •Операция поиска в строке
- •Оператор замены в строке
- •Обратные ссылки
- •Предопределённые переменные
- •Замена в текстовом файле
- •Функции работы со строками
- •Порядок выполнения работы
- •Подчинённая таблица «Корреспонденция»
- •Вариант 2 Главная таблица «Партнёры»
- •Подчинённая таблица «Сделки»
- •Вариант 3 Главная таблица «Сотрудники»
- •Подчинённая таблица «Поручения»
- •Вариант 4 Главная таблица «Товары»
- •Подчинённая таблица «Сертификаты»
- •Вариант 5 Главная таблица «Заказы»
- •Подчинённая таблица «Заказчики»
- •Вариант 6 Главная таблица «Поставки»
- •Подчинённая таблица «Посредники»
- •Вариант 7 Главная таблица «Терминалы»
- •Подчинённая таблица «Покупки»
- •Вариант 8 Главная таблица «Плательщики»
- •Подчинённая таблица «Счета»
- •Вариант 9 Главная таблица «Проекты»
- •Подчинённая таблица «Исполнители»
- •Вариант 10 Главная таблица «Мероприятия»
- •Подчинённая таблица «Персонал»
Групповые операции
Запросы позволяют не только отбирать нужную информацию из таблиц и представлять её путём создания вычисляемых полей, но и производить группировку записей и статистические (итоговые) вычисления по их подмножествам. Всё вместе это называется групповыми операциями. Именно наличие групповых операций определяет, что перед нами сложный запрос на выборку.
Сложные запросы создают на основе известного нам бланка запроса, только теперь в нем появляется дополнительная строка – Групповая операция (ГО). Для добавления этой строки в бланк надо активизировать команду Групповые операции.
Потом в тех полях, по которым производится группировка, надо в строке ГО выбрать из списка соответствующую операцию Группировка. В тех полях, по которым следует провести статистические вычисления, надо выбрать одну из статистических операций (Sum, Avg, Min, Max, Count).
Рассмотрим подробно основные из групповых операций.
Группировка
Поскольку статистические операции имеет смысл использовать не для каждой отдельной записи, а для групп (подмножеств) записей, то предварительно записи надо сгруппировать по какому-либо полю или набору полей. Эта операция представляет собой объединение (склейку) тех записей, которые в определённом поле имеют одинаковые значения.
Рассмотрим группировку на примере таблицы Сотрудники (главная таблица варианта №3, см. приложение). Если сгруппировать записи только по полю НазвОтдела, то мы получим в итоге следующий набор записей:
Название отдела |
Сбыт |
Маркетинг |
Склад |
Как мы видим, из 5 записей осталось 3, поскольку в таблице у нас только 3 различных отдела.
Если сгруппировать записи по полям НазвОтдела и РабТелефон, то мы получим уже следующее:
Название отдела |
Рабочий телефон |
Сбыт |
346-52-14 |
Маркетинг |
346-99-85 |
Склад |
257-42-23 |
Сбыт |
346-52-15 |
Только на складе были 2 сотрудника с одинаковым номером телефона. Во всех остальных случаях пара значений НазвОтдела-РабТелефон была различной.
Следует также обратить внимание на то, что группировка записей не является самоцелью: для удаления дубликатов в полях существуют гораздо менее затратные методы. Группировка – это лишь формирование подмножеств записей для статистических вычислений.
Sum
Представляет собой сумму по сгруппированному набору записей. В случае таблицы Сотрудники вычислим общий размер зарплаты по каждому отделу. БЗ примет вид
Поле: |
НазвОтдела |
Зарплата |
… |
… |
… |
ГО: |
Группировка |
Sum |
В результате получим
Название отдела |
Sum-Зарплата |
Сбыт |
39000,00р. |
Маркетинг |
44732,50р. |
Склад |
26570,15р. |
Avg
Вычисляет среднее значение по записям (имеется в виду среднее арифметическое). Рассчитаем среднюю зарплату сотрудников по отделам и получим
Название отдела |
Avg-Зарплата |
Сбыт |
19500,00р. |
Маркетинг |
44732,50р. |
Склад |
13285,08р. |
Min, Max
Выдаёт минимальное и максимальное значение поля в сгруппированных записях. Например, минимальная зарплата в отделах будет следующей
Название отдела |
Min-Зарплата |
Сбыт |
14000,00р. |
Маркетинг |
44732,50р. |
Склад |
19570,15р. |
Count
Вычисляет то, сколько записей были объединены в каждую из групп. В нашем случае, допустим, мы хотим узнать, сколько сотрудников у нас работают в каждом отделе. В итоге мы получим
Название отдела |
Count-Зарплата |
Сбыт |
2 |
Маркетинг |
1 |
Склад |
2 |
Выражение
Выбрав эту операцию, разработчик может сам, вручную написать формулу вычисление статистических данных. Формула, как и в случае с вычисляемым полем, пишется в строке бланка запроса Поле. Например, запрос вида
Поле: |
НазвОтдела |
Зарплата |
… |
… |
… |
ГО: |
Группировка |
Sum |
эквивалентен запросу вида
Поле: |
НазвОтдела |
Sum-ЗП: Sum([Зарплата]) |
… |
… |
… |
ГО: |
Группировка |
Выражение |
Такая возможность сделана для того, чтобы разработчик мог получать более сложные статистические результаты. Например, пусть в нашей таблице Сотрудники зарплата хранится без вычета подоходного налога в 13%. А мы хотим узнать сумму зарплат по отделам уже с вычетом налога (так называемый «чистый» доход). Тогда нам нужно записать следующее:
Поле: |
НазвОтдела |
Sum-ЧистЗП: 0,87*Sum([Зарплата]) |
… |
… |
… |
ГО: |
Группировка |
Выражение |
При записи выражения со статистическими операциями существуют следующие ограничения.
Нельзя одну статистическую операцию вставлять в другую, например, Sum(Avg([Зарплата])).
Нельзя использовать поле вне статистической операции, если по нему не была произведена группировка. Запись Avg([Зарплата])*[Производит_ть], к примеру, допускает неоднозначную трактовку: какую производительность должна взять СУБД для отдела сбыта – 85% Звягина или 70% Сучкова? Вместо этого можно записать Avg([Зарплата]*[Производит_ть]).
Условие
Строка ГО в БЗ неслучайно располагается выше строк задания критериев отбора (Условие отбора, или, …). При выборе любой из описанных выше групповых операций все критерии будут проверяться для уже сгруппированных записей.
Пример. Пусть для таблицы Сотрудники нам нужен общий размер зарплаты по отделам в том случае, если он превышает 30 тысяч рублей. Запрос
Поле: |
НазвОтдела |
Зарплата |
… |
… |
… |
Групповая операция: |
Группировка |
Sum |
… |
… |
… |
Условие отбора: |
|
> 30000 |
выдаёт
Название отдела |
Sum-Зарплата |
Сбыт |
39000,00р. |
Маркетинг |
44732,50р. |
Очевидно, что пока мы не сгруппируем записи и не произведём статистические вычисления, мы не можем проверить подобное условие.
Условия такого вида называются постусловиями (условия ПОСЛЕ группировки). Они записываются как обычные условия.
Однако в ряде случаев более уместным и правильным оказывается применение предусловий, когда набор записей фильтруется ДО группировки. В этом случае для поля в БЗ следует создать отдельный столбец и в строке ГО выбрать операцию Условие. Теперь критерии, записанные в строках задания условий в таком столбце, будут проверяться до группировки.
Например, нужны суммы по отделам только тех зарплат, которые превышают 10000р. Запрос
Поле: |
НазвОтдела |
Зарплата |
Зарплата |
… |
… |
… |
… |
Групповая операция: |
Группировка |
Sum |
Условие |
… |
… |
… |
… |
Условие отбора: |
|
|
> 10000 |
выдаёт
Название отдела |
Sum-Зарплата |
Сбыт |
39000,00р. |
Маркетинг |
44732,50р. |
Склад |
19570,15р. |
Видим, что зарплата Демьяновского не вошла в итоговую сумму складских зарплат.
Заметим, что наличие предусловий не исключает возможности наличия постусловий и наоборот.
В строке ГО можно указать лишь одну итоговую функцию. А как быть, если надо найти и сумму, и среднее, и максимальное значение, и еще что-то? Решение простое: одно и то же поле можно включить в БЗ несколько раз.