Еще одной функцией запросов Access является анализ данных, которые распределены по разным таблицам. Анализ данных может выполняться с помощью:
В табл. 8.6 перечислены типы данных ANSI SQL, эквивалентные им типы данных языка Jet SQL и допустимые синонимы.
Сейчас в таблице отображаются данные о продажах по всем товарам и всем странам. Она напоминает результат перекрестного запроса, но далее вы убедитесь, как легко можно с ней манипулировать, отображая в ней разные данные. Например, она может быть очень легко изменена когда требуется посмотреть выборочно данные по отдельной стране или странам и некоторым товарам, т. е. по тем полям, которые отображаются в области фильтра, области строк и области столбцов.
Справа от названия каждого из этих полей видна небольшая стрелка вниз. Щелкните по этой стрелке в поле "Страна" (Country) в области фильтра. Появится небольшое окно со списком значений поля, которые присутствуют в исходных данных. По умолчанию у каждой страны установлен флажок (рис. 8.34).
Форматирование элементов сводной диаграммы выполняется с помощью различных вкладок диалогового окна
Свойства
(Properties):
Мы не будем здесь описывать подробно все возможности форматирования диаграммы (их очень много), поскольку вы сами сможете легко понять, как изменяются параметры в окне Свойства (Properties), и получать диаграммы, удовлетворяющие самого требовательного начальника.
Для форматирования полей сводной таблицы используется диалоговое окно Свойства (Properties). Можно задать формат для полей области фильтра, строк, столбцов и детальных данных. Для этого сначала нужно выделить поле, а затем раскрыть вкладку
Формат
(Format) диалогового окна свойств. Эта вкладка показана на рис. 8.48.
Часть зарезервированных слов ANSI SQL заменяется в Jet SQL операторами или функциями. В табл. 8.4 перечислены функции и операторы Jet SQL, которые соответствуют зарезервированным словам ANSI SQL.
Глава 8. Редактирование и анализ данных с помощью запросов Создание таблиц с помощью запроса Преобразование запроса на выборку в запрос на изменение Выполнение запроса на изменение Создание запросов на добавление данных Создание запросов на обноачение таблиц Создание запросов на удаления записей Анализ данных с помощью запросов Перекрестные запросы Использование фиксированных заголовков столбцов в перекрестных запросах Изменение уровня детализации в запросе Статистические функции для выполнения расчетов Вычисления на всем диапазоне записей Вычисления на выделенных записях таблицы Отбор повторяющихся записей и записей без подчиненных Сводные таблицы Создание сводной таблицы Фильтрация данных сводной таблицы Изменение сводной таблицы Сортировка в сводной таблице Изменение уровня детализации Общие и промежуточные итоги Форматирование сводной таблицы Сводные диаграммы Создание сводной диаграммы Изменение вида диаграммы Форматирование элементов сводной диаграммы Настройка свойств полей в запросе и свойств самого запроса Создание запросов SQL Сравнение ANSI и Jet SQL Зарезервированные слова Jet SQL Функции и операторы Access, используемые вместо ключевых слов ANSI SQL Зарезервированные слова Jet SQL и функции, не входящие в ANSI SQL Эквивалентные типы данных Jet SQL и ANSI SQL Подстановочные знаки при сравнении строк Зарезервированные слова DISTINCTROWu. DISTINCT Использование разделителей и символов SQL Использование инструкций SQL для создания запросов Создание запросов на объединение записей Создание запроса к серверу Управляющие запросы Создание подчиненных запросов Выводы |
Для того чтобы в построенном запросе вывести столбцы в порядке календарной очередности месяцев, нужно задать фиксированные заголовки столбцов:
После ключевого слова IN указываются, если они есть, фиксированные названия столбцов.
Есть несколько типов запросов, которые невозможно создать с помощью Конструктора запросов. Их можно создать, вводя соответствующую инструкцию в окне SQL. Для этого нужно:
Ниже рассматриваются запросы, которые могут быть введены только в режиме SQL.
Разделителями в SQL также являются запятая, точка, точка с запятой и двоеточие. Описанные ниже разделители применяются с небольшими отличиями в ANSI SQL и в Jet SQL. Так в Jet SQL:
В инструкциях SQL, разбитых на несколько строк, часто встречаются отступы, которые указывают на продолжение предыдущей строки или на фрагмент, связанный с расположенным на предыдущей строке ключевым словом.
Сводные таблицы предназначены только для чтения, данные в них нельзя изменять. Но зато пользователь может очень легко трансформировать сводную таблицу: добавлять новые строки и столбцы, менять их местами, изменять названия полей и уровень детализации отображаемых данных.
В каждой области таблицы может размещаться не одно, а несколько полей данных. Чтобы добавить неиспользованные поля запроса в сводную таблицу, просто перетащите их мышью в нужную область.
Например, можно добавить в область фильтра поле "Клиенты. Название" (CompanyName), что позволит фильтровать данные не только по странам, но и по клиентам. Перетащите поле "Клиенты. Название" (CompanyName) из списка полей в область фильтра и поместите его рядом с полем "Страна" (Country). Устанавливая флажки против нужных клиентов, вы сможете получать сводные данные по счетам для каждого клиента.
Чтобы удалить поле строки, столбца или фильтра из таблицы, перетащите его мышью за пределы сводной таблицы (при этом рядом с курсором появится изображение креста). Поле исчезнет из таблицы.
Вы можете легко поменять местами поля из области фильтра и из области столбцов или строки поменять местами со столбцами. Переместите поле "Клиенты.Название" (CompanyName) в область столбцов, а поле "Годы" (Year) — в область фильтра. Теперь в столбцах таблицы будут отображаться данные по продажам для каждого клиента (рис. 8.40), а, используя поле "Дата размещения по месяцам" (Order Date By Month), вы сможете фильтровать эти данные.
Вернемся к первоначальному виду таблицы, когда в столбцах отображались данные по годам (см. рис. 8.33). Рассмотрим, как можно изменить уровень детализации данных, выводимых в сводной таблице.
Обратите внимание, что в наименованиях поля столбцов справа виден маркер развертывания (значок плюса в квадратике). Это означает, что в данный момент отображаются данные самого верхнего уровня детализации.
Замечание
Обратите внимание, что, выполняя все эти операции, мы не создавали никаких вычисляемых полей. Так, Access 2002 умеет работать с данными типа
Дата
(Date/Time).
Для создания удобного для анализа представления или наглядного графика можно сократить число строк и столбцов в результатах построенного запроса. С этой целью создадим перекрестный запрос, который выводит ежеквартальную выручку от продаж по типам товаров. Чтобы создать такой запрос:
Так же, как и сводная таблица, сводная диаграмма является очень гибкой, и ее можно легко трансформировать, добавляя и удаляя поля, перемещая их из одной области в другую. Кроме того, можно изменить тип диаграммы, например, превратить ее из гистограммы в график (рис. 8.54). В этом случае каждая ломаная линия соответствует серии столбцов на столбчатой диаграмме. Каждая линия выделяется своим цветом и видом точек. Легенда описывает, какому значению поля "Годы" (Year) соответствует каждая линия.
По умолчанию поля в запросе наследуют все свойства, которые определены для поля соответствующей таблицы. Однако можно изменить значение этих свойств, и эти изменения будут влиять только на поля в запросе и не будут влиять на поля в исходной таблице.
К вычисляемому полю в запросе применимы только свойства, заданные в запросе, т. к. данные, отображаемые в вычисляемом поле, не хранятся в исходной таблице. Например, если значение в поле вычисляется путем перемножения чисел, которые не являются целыми, следует установить свойство
Формат
(Format) для этого поля. Можно также, вместо того, чтобы устанавливать свойство
Формат,
применить функцию Format (<имя поля>, <формат>) или подходящую функцию преобразования типов данных, чтобы получить отображение данных в столбце в требуемом формате.
Существует несколько способов вывода на экран диалогового окна, содержащего свойства запроса или свойства поля в запросе. Сначала нужно щелкнуть левой кнопкой мыши в нужном столбце или на свободном поле в верхней панели запроса (для вывода свойств самого запроса), затем нажать кнопку
Свойства
(Properties) на панели инструментов или выполнить команду
Вид, Свойства
(View, Properties). Появится диалоговое окно, содержащее соответствующий список свойств. Кроме того, можно щелкнуть правой кнопкой мыши в столбце бланка запроса и выбрать в контекстном меню команду
Свойства
(Properties). Самый быстрый способ вывода окна свойств запроса — это дважды щелкнуть левой кнопкой мыши по свободной области верхней части окна запроса.
В окне свойств поля можно задать значения четырех свойств:
Каждое из перечисленных свойств соответствует соглашениям о свойствах полей таблиц. Присваивание значения свойству
Подпись
(Caption) эквивалентно указанию префикса в строке
Поле
(Field) в бланке запроса для этого поля. Значение свойства
Маска ввода
(Input Mask) необязательно соответствует значению свойства
Формат поля
(Format). Например, поле с типом данных
Дата/время
(Date/Time) может иметь средний формат даты для вывода, а в маске ввода можно задать короткий формат.
Диалоговое окно
Свойства запроса
(Query Properties) представлено на рис. 8.57.
Как вы уже убедились, при создании сводной таблицы Microsoft Access автоматически добавляет общие итоги для строк и столбцов. Кроме того, если в области строки или столбца содержится больше одного поля, то выводятся и промежуточные итоги. Вы научились скрывать детальные данные, отображая в таблице только итоговые. Но можно скрывать при желании и итоговые данные, оставляя в таблице только детальные. Кроме того, для расчета итоговых значений можно использовать несколько функций, а не только суммирование, как это было показано в приведенном выше примере. И, наконец, для расчета итоговых значений можно создавать и добавлять в таблицу вычисляемые поля. Об этих возможностях и будет рассказано в данном разделе.
Чтобы скрыть общий итог по строкам, необходимо выделить крайнее левое поле в области строк (в нашем примере "Категория" (CategoryName)) и нажать кнопку
Итоги
(Subtotal) на панели инструментов. Аналогично, чтобы скрыть общий итог по всем столбцам, нужно выделить самое левое поле в области столбцов и нажать ту же кнопку. На рис. 8.45 показана таблица нашего примера со скрытыми значениями общих итогов.
Чтобы снова отобразить общий итог, опять выделите нужное поле и нажмите эту кнопку второй раз.
Если вы выделите любое другое поле в области строк или столбцов и нажмете кнопку
Итоги
(Subtotal), будут скрыты промежуточные итоги для этого поля.
Для создания итоговых значений мы использовали команду
Автовычисления
(AutoCalc). Эта команда в зависимости от типа данных в поле, по которому подводятся итоги, сама выбирает подходящую функцию. Например, если поле числового типа, обычно используется функция Sum (), если текстового — Count (). Вообще говоря, для расчета итоговых значений можно использовать почти те же статистические функции, что и при группировке в запросах на выборку. Список этих функций приведен в табл. 8.1
(см. разд. "Статистические функции для выполнения расчетов" выше в этой главе).
В данном случае отсутствуют только функции First () и Last ().
Типичной операцией, которую приходится выполнять в базе данных, является поиск дубликатов, т. е. повторяющихся записей в таблице. Например, можно выяснить, не встречается ли в таблице "Клиенты" (Customers) одна и та же фирма несколько раз. При этом необходимо сначала определить, какие записи считать дубликатами. В данном случае дубликатами мы будем считать организации с одинаковыми названиями и адресами. Можно создать запрос, который найдет все такие записи. Для этого проще всего воспользоваться соответствующим мастером:
Перекрестные запросы —
это запросы, в которых происходит статистическая обработка данных, результаты которой выводятся в виде таблицы, очень похожей на сводную таблицу Excel. Перекрестные запросы обладают следующими достоинствами:
Однако они имеют и недостатки — например, нельзя сортировать таблицу результатов по значениям, содержащимся в столбцах, т. к. в подавляющем большинстве случаев одновременное упорядочивание данных в столбцах по всем строкам невозможно. При этом вы можете задать сортировку по возрастанию или по убыванию для заголовков строк.
Перекрестные запросы удобны для представления данных в виде таблицы, но т. к такая таблица часто имеет разное количество столбцов, на них довольно сложно строить отчеты. Создание отчета на базе перекрестного запроса будет рассматриваться
в гл. 13.
В качестве примера сформируем два перекрестных запроса к базе данных "Борей" для вывода ежемесячных продаж товара (по его коду) и ежеквартальных продаж товара (по его типу). Подобные таблицы, содержащие итоги, которые подводятся через определенные промежутки времени, например через каждый месяц или квартал, обычно используются в качестве данных для графиков.
В описываемой ниже пошаговой процедуре создания перекрестного запроса показано, как можно пользоваться выражениями для создания новых вычисляемых полей в запросах.
Итак, мы будем создавать перекрестный запрос, в котором в строках выводятся товары, а в столбцах — соответствующие им ежемесячные объемы продаж. Для этого:
Объем продаж: Sum([Количество]*[Заказано].[Цена])
Это будет поле, значение которого вычисляется с помощью описанного выражения, а название поля — "Объем продаж". В выражении используются поля из таблиц, которые включены в запрос, однако обратите внимание, что сами поля в результат запроса не включены. Это означает, что при создании вычисляемого поля в выражение можно включать ссылки не только на поля самого запроса, но и на поля, которые не включаются в результат запроса. Важно, чтобы они были в исходных таблицах. При ссылке на поле "Цена" в выражении мы указали еще имя таблицы "Заказано", а при ссылке на поле "Количество" не указывали. Указать имя таблицы пришлось потому, что поле с именем "Цена" присутствует и в таблице "Товары" и в таблице "Заказано". Если не указать в выражении имени таблицы, Access не сможет определить, из какой таблицы брать значения, поэтому при выполнении запроса выдаст сообщение об ошибке, как это представлено на рис. 8.13.
В данном случае речь идет о трех подстановочных знаках, приведенных в табл. 8.7.
Чтобы создать таблицу из результатов запроса, использовавшегося для отбора записей в связанных таблицах, его нужно преобразовать из запроса на выборку в запрос на изменение. Для этого:
Внимание
В базе данных Access не должно быть таблицы и запроса с одинаковыми именами.
В этом диалоговом окне можно определить также, где должна быть создана таблица — в текущей базе данных (переключатель
в текущей базе данных
(Current Database) выбран по умолчанию) или в другой базе данных. В последнем случае нужно выбрать переключатель
в другой базе данных
(Another Database) и ввести имя этой базы данных.
В первой части книги мы познакомили вас с одним из важнейших объектов базы данных Access — запросами. При этом рассматривался только один вид запросов — запросы на выборку данных из таблиц. Microsoft Access, однако, позволяет не только выбирать нужные данные, но и изменять их с помощью специальных запросов. Такие запросы называются
запросами на изменение
(Action Query). Существует четыре типа запросов на изменение.
Если таблицы содержат большое количество данных, важно не только извлечь нужные данные, но и как-то обработать их, т. е. представить в виде, удобном для анализа. В предыдущих версиях Access для этого существовал специальный вид запросов — перекрестные запросы. В Access 2002 для анализа данных можно применять сводные таблицы — мощное и удобное средство анализа, уже давно прекрасно зарекомендовавшее себя в Microsoft Excel. Сводные данные можно теперь представить не только в табличном, но и в графическом виде с помощью сводных диаграмм.
Более простым способом обработки результирующих данных запроса является группировка и вычисление различных итоговых значений. Это можно сделать прямо в запросе на выборку, определив поля для группировки и используя статистические функции.
И наконец, для создания запросов можно использовать специальный язык — Jet SQL, т. е. диалект языка структурированных запросов, который используется ядром базы данных Access — процессором обработки данных Jet.
Итак, в этой главе описывается:
Запрос на создание таблицы может использоваться многократно для создания временных таблиц, при этом каждый раз будет создаваться новая таблица и удаляться старая.
Замечание
Если записи добавляются в таблицу, которая уже непуста, то наиболее часто встречающейся ошибкой при выполнении этого запроса является попытка вставить записи, у которых значение первичного ключа совпадает с ключами уже имеющихся в ней записей. Такие записи вставлены не будут, будет только выдано сообщение об их количестве.
Совет
Прежде чем выполнять запрос на обновление, щелкните левой кнопкой мыши по стрелке на кнопке
Вид
(View) и выберите
Режим таблицы
(Datasheet View). Вы увидите все записи, которые будут обновлены, хотя данные в обновляемых полях будут еще старые. И только убедившись, что отобраны нужные записи, можно выполнять запрос.
В приведенном примере изменялись значения в поле, которое не является первичным ключом в таблице "Товары" (Products). Особый случай возникает, когда требуется обновить значение первичного ключа в таблице. Если эта таблица связана отношением "один-ко-многим" с другими таблицами, то при изменении первичного ключа записи должны одновременно измениться значения внешних ключей во всех связанных записях подчиненных таблиц. Access обеспечивает выполнение такого изменения автоматически, т. к. поддерживает каскадное обновление записей. При определении связи между таблицами можно установить флажок
каскадное обновление связанных полей
(Cascade Update Related Fields)
(см. разд. "Поддержка целостности данных" гл. 2).
Если такой флажок установлен, то при изменении значения первичного ключа в главной таблице Access автоматически выполняет специальный запрос, с помощью которого обновляются внешние ключи всех связанных записей в подчиненной таблице.
Убедиться в том, как работает такой запрос, можно на примере таблиц "Сотрудники" (Employees) и "Заказы" (Orders). Для этого нам придется сначала сделать копии этих таблиц и установить связь между ними:
Для выполнения каскадного обновления:
Однако такое каскадное удаление записей не всегда возможно. Например, для рассмотренной нами в предыдущем разделе связи таблиц "Сотрудники" и "Заказы" нельзя устанавливать флажок
каскадное удаление связанных записей
(Cascade Delete Related Records), т. к. удаление записи о сотруднике из таблицы "Сотрудники" не должно повлечь за собой удаление всех его заказов. Если вы попытаетесь удалить какую-либо запись о сотруднике и в таблице "Заказы" (Orders) окажутся заказы, принятые этим сотрудником, Access выдаст сообщение об ошибке (рис. 8.12).
Замечание
Для того чтобы выполнялась автоматическая проверка целостности данных, не забудьте для всех связей в базе данных установить флажок Обеспечение целостности данных (Enforce Referential Integrity).
Выберите в ячейке
Групповая операция
(Total) того же столбца значение
Выражение
(Expression), а затем в ячейке
Перекрестная таблица
— значение
Значение
(Value). В столбце "Объем продаж" вычисляется общий объем заказов на каждый товар, который будет подставляться в ячейки результирующей таблицы запроса.
Стоит обратить внимание, что выведенная перекрестная таблица обладает одним недостатком: расположение столбцов определяется алфавитным порядком их заголовков, а не хронологической очередностью. Избежать этой неприятности можно. Для этого необходимо задать порядок сортировки заголовков столбцов. В следующем разделе мы покажем, как это можно сделать.
Замечание
В ANSI SQL слова TRANSFORM и PIVOT не являются зарезервированными словами, а ключевое слово IN интерпретируется по-разному в Access и ANSI SQL. Обратите также внимание на формат даты в инструкции SQL: сначала пишется номер месяца, а потом число месяца, разделителем является косая черта, и все выражение содержится между значками #. Именно в таком формате должны быть всегда написаны даты в предложении SQL, хотя, как вы видели, в бланке запроса можно писать даты в привычном нам европейском формате. Нужное преобразование Конструктор выполняет автоматически.
Рис. 8.18. Перекрестная таблица с фиксированными заголовками столбцов
Рис. 8.20. Перекрестная таблица с итогами по кварталам
Статистические функции можно использовать также в вычисляемых полях запроса. Например, для создания запроса "Итоги по клиентам" мы могли бы нместо запроса "Сведения о заказах" использовать прямо таблицу "Заказано". На рис. 8.26 показано вычисляемое поле "Стоимость". В выражение для этого поля включена функция Sum ():
Стоимость: Sum(CCur([Заказано].[Цена]*[Количество]*(1-[Скидка])/100) *100)
Тогда в строке
Групповая операция
(Total) для этого столбца должен быть выбран элемент
Выражение
(Expression). При использовании группировки по полю "КодЗаказа", поле "Стоимость" будет содержать общую стоимость заказа.
Можно создать и другое вычисляемое поле:
Стоимость: CCur([Заказано].[Цена]*[Количество]*(1-[Скидка])/100) *100,
а функцию Sum () использовать в строке
Групповая операция
(Total). Оба варианта будут правильны.
Можно изменить этот запрос таким образом, чтобы посчитать общее число клиентов, заказов и общую сумму всех заказов. В этом случае результатом запроса будет одна строка, содержащая итоговые значения по всем полям. К сожалению, нельзя построить запрос, результатом которого была бы таблица, содержащая как детальные, так и итоговые данные, как это обычно бывает в таблицах Excel. Такое представление данных можно организовать только в сводных таблицах.
Внимание
Статистические функции при вычислениях не обрабатывают записи, которые имеют значение Null в том поле, к которому они применяются. Поэтому нужно быть осторожным при использовании функции Count (). Она будет считать только те записи, которые не содержат пустых значений. Если нужно сосчитать все записи в результирующем наборе или группе, используйте функцию Nz (<имя поля>), которая преобразует пустое значение в 0, и только потом суммируйте.
In (SELECT [Название] FROM [Клиенты] As Tmp GROUP BY [Название],[Адрес] HAVING Count(*)>l And [Адрес] = [Клиенты].[Адрес])
Это выражение включает еще один запрос. Такой запрос называется
подчиненным
запросом
(подробнее о подчиненных запросах см. разд. "Создание подчиненных запросов" в конце данной главы).
Чтобы посмотреть, как полностью выглядит инструкция SQL, соответствующая этому запросу, нужно перейти в режим SQL.
Совет
Мы рекомендуем при работе с запросами в режиме Конструктора чаще открывать окно
Режим SQL
(SQL View). Изучая, как Access создает инструкции SQL, можно постепенно выучить этот язык. Правда, помните, что в данном случае мы имеем дело с диалектом стандартного языка SQL — Access SQL. Ниже мы расскажем, чем он отличается от стандартного языка SQL (см. разд. "Сравнение ANSI и Jet SQL" данной главы).
Такой поиск разумно выполнять также в таблицах, которые экспортированы из другой среды, например Excel. Эти таблицы могут содержать дублирующие записи, которые нужно найти и удалить. Для удаления дубликатов можно воспользоваться процедурой, которая описана в справке Access в разделе
Работа с запросами, Работа с запросами на изменение, Удаление повторяющихся записей из таблицы.
Еще один мастер позволяет найти все записи в главной таблице, которые не имеют связанных записей в подчиненной таблице (обратной ситуации быть не должно, если вы правильно установили флажки, обеспечивающие целостность данных)
(см. также разд. "Поддержка целостности данных" гл. 2).
Чтобы создать запрос, который покажет всех клиентов, которые не имеют заказов:
В бланке запроса в столбце "КодКлиента" задано условие — Is Null. Это означает, что выбираются все клиенты, код которых отсутствует в таблице "Заказы" (Orders). Вы можете использовать это условие всякий раз, когда нужно отыскать записи, у которых одно из полей пусто.
Рис. 8.29. Запрос для поиска записей, не имеющих подчиненных записей
Когда таблица отображается в режиме Сводная таблица, в верхней части окна приложения видна специальная панель инструментов
Сводные таблицы
(Pivot Table). Эта панель инструментов представлена на рис. 8.32.
Краткое описание кнопок этой панели приведено в табл. 8.2.[
Как и в других случаях, в таблице представлены те кнопки, которые используются только в данном режиме.
] В дальнейших разделах этой главы мы познакомимся с большинством функций, связанных с этими кнопками.
Определим итоговые столбцы.
Окончательный вид таблицы представлен на рис. 8.33.
Сбросьте флажок у первой строки — Все (Аll), щелкнув по нему мышкой. Все флажки одновременно сбросятся. Затем установите его только у одной страны, например Бельгия, и нажмите кнопку
ОК.
Теперь ваша таблица отображает данные только по Бельгии. Под названием поля "Страна" (Country) отображается название выбранной страны.
Если нужно отобразить данные сразу для нескольких стран (но не всех), просто установите в списке значений флажки у этих стран. Данные в таблице опять изменятся, только, к сожалению, не видно, какие страны участвуют в выборке — под названием поля в области фильтра указывается просто
несколько элементов
(Multiple Items).
Однако таблицу можно настроить таким образом, чтобы она не позволяла делать множественный выбор в полях фильтра.[
Слово "полях" мы употребили не случайно, т. к. в этой области может быть несколько полей.
]
Для этого:
Теперь рассмотрим, как можно фильтровать отображаемые в таблице данные по значениям поля "Марка" (ProductName), которое находится в области строк.
Раскройте список значений поля, щелкнув по стрелке справа от названия поля. Сбросьте флажок
Все
(Аll) и установите флажки напротив нужных товаров. Нажмите кнопку
ОК.
Таблица стала намного короче, а в названии столбца появился значок фильтра (рис. 8.37).
Чтобы сбросить установленный фильтр, нажмите кнопку
Автофильтр
(AutoFilter) на панели инструментов. Обратите внимание, что при этом сбрасываются все фильтры, в том числе установленные в области фильтра. Последний установленный фильтр сохраняется, и если вы нажмете эту кнопку еще раз, то снова увидите отфильтрованные данные.
Можно установить фильтр и другими способами. Например, можно отобразить только те товары, которые принесли больше всего или меньше всего дохода. Проще всего для этого воспользоваться специальной кнопкой на панели инструментов.
Чтобы убрать этот фильтр, достаточно нажать ту же кнопку еще раз и выбрать элемент
Показать все
(Show All).
Кнопка
Показать верхние и нижние элементы
(Show Top/Bottom Items) позволяет фильтровать данные, основываясь на значениях в области детальных и итоговых данных. Более гибко устанавливать фильтр можно, задавая значения в окне
Свойства
(Properties).
Рис. 8.39. Фильтр для первых элементов сводной таблицы
Совет
При переносе полей обращайте внимание на форму указателя мыши. Когда он попадает в одну из областей таблицы — строк, столбцов, данных или фильтра — его форма меняется, и по ней можно определить, когда следует отпускать кнопку мыши.
Для того чтобы отображать или скрывать детальные данные, можно использовать также маленькие кнопочки с изображением знаков плюса и минуса, находящиеся у каждого значения поля, как в строках, так и в столбцах.
Аналогично отображаются и скрываются данные и для столбцов таблицы.
Детализация данных может быть изменена также при добавлении новых полей в область строк или столбцов. Например, можно добавить в область строк поле "Категория" (Category) и сгруппировать все товары по категориям.
Поле "Категория" отсутствует в исходном запросе "Счета" (Invoices), поэтому сначала нужно перейти в режим Конструктора, добавить к запросу таблицу "Типы" (Categories), затем добавить в бланк запроса поле "Категория" (CategoryName) из этой таблицы и снова вернуться в режим сводной таблицы. В списке полей появится новое поле. Далее необходимо осуществить следующие действия.
Рис. 8.44. Отображение товаров, сгруппированных по категориям
Например, если сводная таблица содержит данные с оценками по всем предметам учеников в школьном классе, то итоговым значением, скорее всего, будет средний бал, для вычисления которого можно использовать функцию Avg (). В одной сводной таблице может быть представлено несколько типов итоговых значений. Например, в нашей таблице можно в качестве итоговых значений отображать не только общие суммы, вырученные за проданные товары, но и количество выписанных счетов. Для того чтобы добавить еще одно итоговое поле, выделите поле "Марка" (ProductName) в области строк и нажмите кнопку
Автовычисления
(AntoCalc). Выберите из списка функцию Count (). Через несколько секунд в сводной таблице для каждого года будет отображено два столбца:
Но второй столбец с итоговыми значениями может быть отображен и по-другому — в виде строки. Для этого:
Для отображения итоговых значений могут быть использованы также вычисляемые поля. Для добавления вычисляемого поля нажмите кнопку
Итоги и вычисляемые поля
(Calculated Total and Fields) на панели инструментов и выберите из раскрывшегося меню значение
Создание вычисляемого итога
(Create Calculated Total). В области данных появятся дополнительные строки или столбцы, и будет открыта вкладка
Вычисление
(Calculated) диалогового окна
Свойства
(Properties) (рис. 8.47).
Вы должны ввести имя нового поля в поле Имя (Name), а формулу для расчета значения — в большое поле, расположенное ниже. Если для составления выражения нужно сослаться на какое-то поле, выберите имя этого поля в списке в нижней части вкладки и нажмите кнопку
Добавить ссылку на
(Insert Reference to). Когда выражение будет готово, нажмите кнопку
Изменить
(Change).
Аналогично можно добавить вычисляемое поле и в детальные данные таблицы, хотя в этом случае вычисляемое поле можно создать и в исходном запросе.
Из этого рисунка видно, что для поля можно определить:
Если в области данных отображаются числовые поля, даты или время,-то можно задать формат отображения данных в этих полях — либо выбрать из списка стандартный формат, либо задать нужный формат с помощью маски. Используйте для этого поле
Число
(Number).
Кроме того, можно задать формат заголовков полей сводной таблицы, для чего предназначена вкладка
Заголовки
(Caption) (рис. 8.49).
В поле Заголовок (Caption) можно задать текст, который будет отображен в названии поля, и затем формат этого текста.
Но можно создать диаграмму и непосредственно на базе запроса или таблицы. При этом одновременно будет создаваться и сводная таблица. Сводная таблица и сводная диаграмма — это две формы представления одних и тех же данных.
В качестве примера предлагается построить сводную диаграмму для запроса "Продажи по сотрудникам и странам" (Employee Sales by Country).
Примечание
Каи уже говорилось выше, одновременно со сводной диаграммой создается и сводная - таблица.
Для того чтобы изменить тип диаграммы, щелкните мышью в любом месте области диаграммы и убедитесь, что эта область выделена. Тогда становится доступна кнопка
Тип диаграммы
(Chart Type) на панели инструментов (рис. 8.55). Нажмите эту кнопку. В диалоговом окне
Свойства
(Properties) раскроется вкладка Тип (Туре). На ней представлены все типы диаграмм, которые могут быть построены. Выберите нужный тип из списка, а затем подтип справа и остановитесь на том типе, который вам больше нравится.
Можно очень легко поменять местами поля рядов и категорий. Для этого достаточно нажать кнопку
По строке или по столбцу
(By Row/By Column) на панели инструментов. И диаграмма мгновенно трансформируется (рис. 8.56). Остальные кнопки панели инструментов, такие как
Свернуть
(Collapse),
Развернуть
(Expand),
Автовычисления
(AutoCalc), работают так же, как и в сводной таблице.
Можно поворачивать диаграмму по часовой или против часовой стрелки. Для этого, выделив область диаграммы, необходимо открыть вкладку
Общие
(General) диалогового окна
Свойства
(Properties) и использовать четыре кнопки:
Отразить справа налево
(Flip Horizontal),
Отразить сверху вниз
(Flip Vertical),
Повернуть на 90° по часовой стрелке
(Rotate Clockwise) и
Повернуть на 90° против часовой стрелки
(Rotate Counter Clockwise).
Рис. 8.56. Трансформация сводной диаграммы
Последние пять свойств позволяют задать свойства подчиненной таблицы, если в запросе отображаются записи как главной, так и подчиненной таблиц: имя таблицы, связывающие поля в главной и подчиненной таблицах, высота таблицы и будет ли она по умолчанию отображаться или же будет скрыта.
В данном случае разницы между употреблением этих модификаторов нет (в других случаях может получиться иной результат). Однако при попытке редактировать данные в таблице вы убедитесь, что при использовании модификатора DISTINCT результирующий набор записей получается необновляемым, а модификатор DISTINCTROW допускает изменение данных в результирующем наборе.
Вместо того чтобы вносить эти модификаторы вручную в режиме SQL, можно просто установить соответствующие свойства запроса. Чтобы открыть диалоговое окно свойств запроса, щелкните правой кнопкой мыши по свободному полю в верхней панели окна Конструктора запроса и выберите из контекстного меню команду Свойства (Properties). Появляется диалоговое окно, представленное на рис. 8.57.
Два свойства в этом окне определяют использование модификаторов DISTINCTROW и DISTINCT:
Уникальные значения
(Unique Values) и
Уникальные записи
(Unique Rows). Свойство
Уникальные значения
соответствует модификатору DISTINCT, a свойство
Уникальные записи
— модификатору DISTINCTROW. Если вы попробуете установить эти значения, то увидите, что Access не позволит установить значения Да (Yes) для обоих свойств. Если одно из них имеет значение
Да
(Yes), то для второго автоматически устанавливается значение
Нет
(No). Если оба свойства имеют значение
Нет
(No), запрос будет включать в результирующий набор все записи.
Замечание
Свойство Уникальные записи имеет смысл только для запроса, который строится по нескольким таблицам. Если запрос имеет только одну таблицу, значение этого свойства игнорируется.
Рис. 8.60. Результирующее множество запроса "Клиенты и поставщики по городам"
В отличие от аналогичных таблиц в перекрестном запросе, данные в сводной таблице легко сортировать. Для этого используются стандартные кнопки
Сортировать по возрастанию
(Sort Ascending) и
Сортировать по убыванию
(Sort Descending) на панели инструментов.
Нужно выделить поле, по которому вы хотите отсортировать данные, и нажать соответствующую кнопку на панели инструментов. Если выделить поле в области строк, то данные будут отсортированы в порядке возрастания или убывания значений этого поля (в нашем примере названия товаров будут отсортированы в алфавитном порядке). Если выделить поле в области столбцов, то столбцы в таблице будут отсортированы в порядке возрастания значений в заголовках столбцов (в данном примере клиенты будут выведены в алфавитном порядке). Если выделить область детальных и итоговых данных таблицы, то она будет отсортирована в порядке возрастания (или убывания) значений в столбце "Общие итоги" (Grand Total).
Инструкции Jet SQL, такие как SELECT, SELECT. .. INTO, INSERT...INTO, DELETE или UPDATE позволяют для вычисления предиката в предложении WHERE использовать другой запрос. Этот запрос называется подчиненным запросом.
Подчиненный запрос включается в главный запрос одним из следующих способов:
где:
сравнение — выражение и оператор сравнения, который сравнивает это выражение с результатами подчиненного запроса;
выражение — выражение, для которого проводится поиск в результирующем наборе записей подчиненного запроса;
инструкцияSQL — инструкция SELECT, которая представляет подчиненный запрос.
Предикаты ANY или SOME являются синонимами и используются если в главном запросе нужно выбрать записи, удовлетворяющие сравнению со всеми записями, выбранными в подчиненном запросе. Ниже приведен пример запроса, который выбирает из таблицы "Товары" (Products) все товары, цена которых не ниже, чем цена товаров у конкурентов:
SELECT * FROM Товары WHERE Товары.Цена > ANY
(SELECT ТоварыКонкурентов.Цена FROM ТоварыКонкурентов)
Предикат ALL используется для выбора в главном запросе только тех записей, которые удовлетворяют сравнению со всеми записями, выбранными в подчиненном запросе. В следующем примере выбираются все заказы, сделанные в 1998 году, стоимость которых ниже стоимости любого заказа, размещенного в 1997 году:
SELECT DISTINCTROW
Заказы.КодЗаказа
FROM Заказы
WHERE Year(Заказы.ДатаРазмещения) = 1998
AND Заказы.СуммаЗаказа < ALL (SELECT Заказы.СуммаЗаказа FROM Заказы WHERE Year(Заказы.ДатаРазмещения) = 1997);
Предикат IN используется для выбора в главном запросе только тех записей, которые содержат значения, совпадающие с одним из значений, выбранных подчинен-ным_ запросом. Например, чтобы выбрать клиентов, которые разместили заказы в январе 1998 года, можно написать следующий запрос:
SELECT * FROM Клиенты WHERE КодКлиента IN
(SELECT КодКлиента FROM Заказы
WHERE ДатаРазмещения
BETWEEN #l/l/98# AND #31/1/981;
И наоборот, предикат NOT IN используется для выбора в главном запросе только тех записей, которые содержат значения, не совпадающие ни с одним из значений, отобранных подчиненным запросом.
Предикат EXISTS используется в логическом выражении для определения того, должен ли подчиненный запрос возвращать какие-либо записи. Например, чтобы выбрать всех поставщиков для товаров в некотором заказе, можно использовать следующую инструкцию SQL:
SELECT DISTINCTROW Поставщики.Название FROM Поставщики WHERE Exists (SELECT Заказано.КодТовара FROM Заказано
WHERE КодЗаказа = 121 AND Заказано.КодТовара = Поставщики.КодТовара); В подчиненном запросе можно-использовать псевдонимы таблиц для ссылки на таблицы, перечисленные в предложении FROM, расположенном вне подчиненного запроса. В следующем примере выбираются фамилии и имена сотрудников, чья зарплата равна или больше средней зарплаты сотрудников, имеющих ту же должность. В предыдущем примере можно присвоить таблице "Сотрудники" (Employees) псевдоним Т1, и тогда запрос будет выглядеть следующим образом:
SELECT DISTINCTROW Поставщики.Название
FROM Поставщики As П1
WHERE Exists
(SELECT Заказано.КодТовара
FROM Заказано
WHERE КодЗаказа = 121 AND Заказано.КодТовара = П1.КодТовара);
Некоторые подчиненные запросы можно использовать в перекрестных запросах как предикаты в предложении WHERE. Подчиненные запросы, применяемые для вывода результатов (в списке SELECT), нельзя применять в перекрестных запросах.
В отличие от запросов на объединение, подчиненный запрос можно создать в режиме Конструктора. В строке
Условия отбора
(Criteria) в качестве условия отбора следует указать, например, зарезервированное слово IN, а затем ввести инструкцию SELECT. А можно сначала создать в режиме Конструктора подчиненный запрос, переключиться в режим SQL, скопировать получившуюся инструкцию SQL в буфер
обмена, а затем создать главный запрос и скопировать в строку Условия отбора (Criteria) подчиненный запрос из буфера.
Создать диаграмму на основе сводной таблицы очень просто. Переключитесь в режим
Сводная диаграмма
(PivotChart View), и на экране появится сводная диаграмма, примерно такая, как на рис. 8.50.
Как и сводная таблица, она имеет поле фильтра — "Страна" (Country), которое отображается в левом верхнем углу экрана, поля строк и столбцов, которые здесь отображаются справа и снизу. Эта сводная диаграмма тесно связана с таблицей. Если вы переключитесь в режим сводной таблицы и измените ее структуру, это изменение будет отображено и на сводной диаграмме, и наоборот, если сейчас изменить структуру сводной диаграммы, то это изменение появится и на сводной таблице, когда вы вновь переключитесь в тот режим.
Для того чтобы продемонстрировать возможности сводных таблиц, рассмотрим запрос "Счета" (Invoices). Раскройте список запросов и откройте этот запрос в режиме Таблицы. Вы увидите таблицу, которая содержит свыше двух тысяч записей и более двух десятков полей. Теперь попробуем представить этот запрос в виде сводной таблицы.
С помощью этого вида запроса вы можете выбрать нужные данные из уже существующей таблицы с помощью обычного запроса на выборку, а затем поместить их в новую таблицу, структура которой определяется структурой записей результирующего множества запроса. Таким образом, процесс создания таблицы с помощью запроса состоит из трех шагов:
Созданию различных запросов на выборку мы уделили достаточно внимания
в гл. 4.
Оставшиеся два этапа описаны ниже на примере запроса на выборку "Холодные клиенты", созданного в базе данных "Борей" при описании внешнего соединения
в гл. 4.
Замечание
Это нужно сделать, чтобы поле не попало в новую таблицу. Поле "КодЗаказа" в таблице "Заказы" определено как Счетчик и не может иметь значение Null. Это свойство наследуется новой таблицей, поэтому если флажок не сбросить, то при выполнении запроса будет выдаваться сообщение об ошибке.
Еще одним типом запроса SQL является запрос к серверу. Он обрабатывается не процессором Jet, как все остальные запросы, а непосредственно передается на сервер базы данных, к которому выполняется обращение, например Microsoft SQL
Server. Главной особенностью этого запроса является то, что он должен использовать синтаксис языка SQL сервера базы данных (для Microsoft SQL Server это — Transact-SQL). Создается этот запрос аналогично запросу на объединение с помощью команды меню Запрос, Запрос SQL, К серверу (Query, SQL Specific, Pass-Through). Запросы к серверу применяются в приложениях, имеющих архитектуру "клиент-сервер".
Создание запросов на доьавление данных
Поэтому сначала создается запрос на выборку данных, в результат которого включаются те поля, которые должны составлять добавляемые записи, а также поля, в которых устанавливаются критерии отбора записей.
В качестве примера мы рассмотрим запрос, который будет выбирать из базы данных все заказы за 1996 год и переносить их в другую таблицу так, чтобы таблица "Заказы" (Orders) содержала только актуальные данные. Для этого сначала создадим таблицу, которая будет хранить устаревшие данные:
В списке появляется новая таблица, пока пустая, т. к. мы скопировали только структуру таблицы "Заказы" (Orders). Теперь создадим запрос на добавление, который позволит перенести в новую таблицу данные из таблицы "Заказы".
Этот тип запроса позволяет объединить в одном результирующем наборе результаты нескольких запросов, таблиц и инструкций SELECT. Синтаксис этого запроса следующий:
[TABLE] запрос_1 UNION [ALL] [TABLE] запрос_2 [UNION [ALL] [TABLE] запрос_п [ ... ]],
где
запрос_1, запрос_2, ... запрос_п — инструкция SELECT, имя сохраненного запроса или имя сохраненной таблицы, перед которым стоит зарезервированное слово TABLE.
В каждом аргументе запрос_1 допускается применение предложения GROUP BY или HAVING для группировки возвращаемых данных. В конец последнего аргумента запрос_п можно включить предложение ORDER BY, чтобы отсортировать возвращенные данные. Таким образом, группировка записей может выполняться в каждом из объединяемых запросов или таблиц, а сортировка выполняется только в результирующем множестве записей запроса на объединение. В качестве поля для сортировки нужно указывать имена полей из первого запроса или таблицы, т. к. именно эти имена будут выступать в качестве имен полей в результирующем множестве запроса.
По умолчанию записи, повторяющиеся в объединяемых таблицах и запросах, не включаются в результирующее множество запроса. Использование предиката ALL в запросе позволяет включить все записи. Кроме того, такие запросы выполняются быстрее.
Все запросы, включенные в операцию UNION, должны отбирать одинаковое число полей; при этом типы данных и размеры полей не обязаны совпадать. Если число полей не совпадает, выводится сообщение об ошибке.
Для создания запроса на объединение существует специальная команда меню
Запрос, Запрос SQL, Запрос на объединение
(Query, SQL Specific, Union), которая доступна в режиме Конструктора запросов. При выполнении этой команды открывается пустое окно
Режим SQL,
в которое нужно ввести инструкцию.
На рис. 8.59 показана инструкция SQL, содержащая операцию UNION, для запроса "Клиенты и поставщики по городам" (Customers and Suppliers by City), который содержится в базе данных "Борей". Чтобы открыть окно SQL, откройте список запросов в окне базы данных, выделите запрос "Клиенты и поставщики по городам" и нажмите кнопку
Конструктор
(Design). При этом кнопка и команда меню
Вид, Конструктор
(View, Design View) становятся недоступными.
Результат выполнения запроса на объединение "Клиенты и поставщики по городам" приведен па рис. 8.60.
Запросы на обновление используются главным образом для того, чтобы внести изменения сразу в большое количество записей с помощью одного запроса. Классическим примером такого запроса является изменение цены в таблице "Товары" (Products) на некоторый постоянный коэффициент, например можно увеличить цену одной из категорий товара на 20%. Чтобы создать такой запрос:
Создание запросов на удаления записей
Запросы на удаление записей позволяют отобрать требуемые записи и удалить их за один прием. Принцип создания такого запроса аналогичен созданию запроса на обновление, однако, удаляя записи из связанных таблиц, необходимо помнить о том, что при этом не должна нарушаться целостность данных.
Если две таблицы связаны отношением "один-ко-многим", нельзя удалять записи из таблицы "один" если в таблице "многие" присутствуют соответствующие им записи. Сначала должны быть удалены записи в таблице "многие" и только потом — соответствующие им записи в таблице "один". Для того чтобы упростить этот процесс, Access позволяет при определении связей между таблицами установить флажок
каскадное удаление связанных записей
(Cascade Delete Related Records). Такой флажок установлен, например, для связи таблиц "Заказы" (Orders) и "Заказано" (Order Details). Действительно, если требуется удалить из базы данных какой-то заказ, должны быть удалены не только запись об этом заказе в таблице "Заказы", но ч все позиции данного заказа в таблице "Заказано".
Для создания запроса на удаления мы воспользуемся уже имеющимся запросом на добавление записей "Копирование заказов".
Все запросы, которые мы рассматривали до сих пор, создавались либо с помощью мастера, либо с помощью Конструктора запросов. Конструктор запросов представляет собой графический инструмент для создания запросов по образцу (QBE — Query By Example). Однако на самом деле любой запрос хранится в базе данных в формате SQL (Structured Query Language — язык структурированных запросов). Основное достоинство этого языка состоит в том, что он является стандартом для большинства реляционных СУБД. SQL имеет унифицированный набор инструкций, которые можно использовать во всех СУБД, поддерживающих этот язык. Действующим на данный момент стандартом языка SQL является принятая Американским национальным институтом стандартов (American National Standards Institute — ANSI) версия SQL-92. Фирмы — разработчики СУБД при реализации языка SQL могут вносить в него расширения, но обязаны реализовать базовый набор команд ASNSI SQL.
Процессор обработки данных Jet является составной частью Access и выполняет инструкции Access SQL (Jet SQL), который отличается от ANSI SQL существенно (как правило, настольные СУБД, совместимые со стандартом SQL, реализуют не все инструкции ANSI SQL).
Замечание
В дальнейшем для обозначения используемого в Access диалекта языка SQL мы будем применять термин Jet SQL. Это будет правильнее, т. к. процессор обработки данных используется не только в приложениях, созданных в среде Access, но и в приложениях, разработанных с помощью Microsoft Visual Basic.
В данном разделе мы собираемся дать обзор используемого в Access языка SQL и показать, как можно создать запросы, которые невозможно создать с помощью Конструктора запросов.
Язык Jet SQL почти соответствует стандарту ANSI SQL-89. В реализацию языка SQL для Microsoft Jet
4.x
(используемого, начиная с версии Microsoft Access 2000) внесены несколько расширений, которые приближают его к стандарту ANSI SQL-92 и
Transact-SQL — диалекту языка SQL для Microsoft SQL Server. Для тою чтобы обеспечить совместимость с предыдущими версиями Microsoft Jet, эти расширения можно использовать только в специальном режиме — ANSI SQL-92.
Замечание
Режим ANSI SQL-92 доступен только при использования программы Microsoft OLE DB Provider для Jet.
Все запросы, которые создаются в режиме ANSI SQL-92, помечаются специальным флажком, причем в одной базе данных могут храниться как обычные SQL-запросы, так и запросы, созданные в расширенном синтаксисе.
Основные различия языков Jet SQL и ANSI SQL состоят в следующем:
они имеют разные наборы зарезервированных слов и типов данных;
Статистические функции
используются в запросах главным образом для вычисления всевозможных итоговых значений, например для числового поля таблицы можно вычислить среднее значение или сумму значений для всех или отобранных записей, можно посчитать количество записей, возвращаемых запросом.
Статистические функции, которые можно использовать в запросах Access, входят в состав Access SQL. Описание этих функций, а также типов полей, к которым они могут быть применены, приведено в табл. 8.1.
Функция |
Типы полей |
Описание |
||
Avg() |
Все типы полей, исключая Текстовый (Text), Поле Memo (Memo) и Поле объекта OLE (OLE Object). |
Вычисляет арифметическое среднее набора чисел, содержащихся в указанном поле запроса |
||
Count ( ) |
Все типы полей |
Вычисляет количество непустых записей, возвращаемых запросом |
||
First ( ) |
Все типы полей |
Возвращает значение поля из первой записи результирующего набора |
||
Last () |
Все типы полей |
Возвращает значение поля из последней записи результирующего набора |
||
Max() |
Все типы полей, исключая Текстовый, Поле Memo и Поле объекта OLE |
Возвращает максимальное значение из набора, содержащегося в указанном поле |
||
Min() |
Все типы полей, исключая Текстовый, Поле Memo и Поле объекта OLE |
Возвращает минимальное значение из набора, содержащегося в указанном поле |
||
StDev() StDevP() |
Все типы полей, исключая Текстовый, Поле Memo и Поле объекта OLE |
Возвращают смещенное и несмещенное значение среднеквадратичного отклонения, вычисляемого по набору значений, содержащихся в указанном поле |
||
Sum( ) |
Все типы полей, исключая Текстовый, Поле Memo и Поле объекта OLE |
Возвращает сумму набора значений, содержащихся в заданном поле |
||
Var() VarP ( ) |
Все типы полей, исключая Текстовый, Поле Memo и Поле объекта OLE |
Возвращают значение смещенной и не смещенной дисперсии, вычисляемой по набору значений, содержащихся в указанном поле |
||
Перечисленных функций обычно достаточно для решения большинства задач. Тем не менее, при необходимости пользователь может самостоятельно написать функцию на языке VBA, которая будет выполнять сложные статистические, научные или инженерные расчеты над данными, и использовать эту функцию в запросах.
Замечание
Все статистические функции Access SQL поддерживаются стандартом ANSI SQL, но не все из них поддерживаются другими СУБД. Например, не все серверные базы данных поддерживают функции StDev(), StDevP(), Var () и VarP (). Поэтому, если вы планируете в дальнейшем перенести свою базу данных на сервер, прежде чем использовать эти функции, нужно убедиться, поддерживаются ли они сервером. Иначе потом придется изменять все объекты, в которых встречаются эти функции.
Использование статистических функций для расчета итоговых значений тесно связано с применением групповых операций в запросе. Групповые операции позволяют задать группы, для которых выполняются вычисления. Ниже мы приведем примеры таких расчетов как на всем множестве записей, так и на подмножествах, выбранных по условиям запроса.
Для того чтобы отображение данных было еще более наглядным, можно использовать сводные диаграммы. Сводная диаграмма строится автоматически на основе уже созданной сводной таблицы, но может также строиться и самостоятельно, на основе исходной таблицы или запроса. Когда диаграмма построена, ее можно перестраивать, перетаскивая поля, аналогично тому, как это делается в сводных таблицах.
Сводные таблицы
Сводная таблица —
это еще одно удобное средство для анализа данных. Они позволяют превратить обычную таблицу или результирующее множество запроса, содержащее большое число записей и непригодное для анализа, в компактную таблицу, включающую только итоговые данные. Причем, в отличие от перекрестных запросов, структура сводной таблицы легко трансформируется, позволяя просматривать данные в различных разрезах и с различной степенью детализации, что и требуется для анализа. Кроме того, данные, представленные в табличной форме, могут быть легко преобразованы в графическую форму с помощью сводных диаграмм, что делает их еще более наглядными.
Замечание
Режим Сводная таблица может быть применен и к таблице, и к запросу, и к форме. Но, на наш взгляд, он наиболее применим именно к запросу, который обычно объединяет данные из нескольких таблиц и эти данные нужно иметь возможность представить в удобном для анализа виде.
Кнопка |
Описание |
Команда меню |
||
Автофильтр
(AutoFilter) |
Устанавливает и сбрасывает фильтры |
Сводная таблица, Автофильтр
(PivotTable, AutoFilter) |
||
Показать верхние и нижние элементы
(Show Top/Bottom Items) |
Устанавливает фильтр, отображая заданное число первых или последних строк в' отсортированной таблице |
Сводная таблица, Показать верхние и нижние элементы
(PivotTable, Show Top/Bottom Items) |
||
Автовычисления
(AutoCalc) |
Позволяет вычислить промежуточные итоги по каждой группе записей |
Сводная таблица, Автовычисления (PivotTable, AutoCalc) |
||
Итоги
(Subtotal) |
Позволяет отображать или скрывать итоговые столб- |
Сводная таблица, Итоги
(PivotTable, Subtotal с) |
||
|
цы или строки |
|
||
Вычисляемые итоги и поля (Calculated Total and Fields) |
Позволяет задать формулы для расчета как специальных полей, так и итоговых данных |
Сводная таблица, Вычисляемые итоги и поля (PivotTable, Calculated Total and Fields) |
||
Отобразить как (Show As) |
Позволяет отображать итоговые значения в процентах относительно общего итога по столбцу, строке или родительскому элементу на оси столбца или строки |
Сводная таблица, Отобразить как (PivotTable, Show As) |
||
Кнопка
|
Описание
|
Команда меню
|
||
Свернуть (Collapse) |
Уменьшает на один шаг уровень детализации отобра- |
Сводная таблица, Свернуть
(PivotTable, Collapse) |
||
|
жаемых данных в выделенной области таблицы |
|
||
Развернуть (Expand) |
Увеличивает на один шаг уровень детализации отображаемых данных в выделенной области таблицы |
Сводная таблица, Развернуть
(PivotTable, Expand) |
||
Скрыть подробности
(Hide Details) |
Позволяет скрыть детальные данные и оставить только подытоги и итоги |
Сводная таблица, Скрыть подробности (PivotTable, Hide Details) |
||
Подробности (Show Details) |
Отображает все данные в строках или столбцах таблицы |
Сводная таблица, Подробности
(PivotTable, Show Details) |
||
Обновить (Refresh) |
Обновляет сводную таблицу, выполняя повторный запрос к базе данных |
Сводная таблица, Обновить
(PivotTable, Refresh) |
||
Экспорт в Microsoft Excel (Export to Microsoft Excel) |
Обеспечивает экспорт сводной таблицы в интерактивный сводный отчет Microsoft Excel |
Сводная таблица, Экспорт в Microsoft Excel (PivotTable, Export to Microsoft Excel) |
||
Список полей (Field List) |
Отображает диалоговое окно со списком полей таблицы |
Вид, Список полей (Field List) |
||
Зарезервированное слово |
Эквивалент в Access |
||
AUTHORIZATION | Диалоговое окно прав доступа | ||
BEGIN |
Метод Access VBA BeginTrans |
||
CHECK | Свойство Условие на значение поля таблицы | ||
CLOSE | Кнопка системного меню Закрыть | ||
COMMIT |
Метод Access VBA CommitTrans |
||
CREATE VIEW |
Режим конструктора запросов и фильтры |
||
CURRENT |
Запрос в режиме таблицы, области выделения записи |
||
CURSOR |
Запрос в режиме таблицы |
||
DECLARE |
Запрос в режиме таблицы (курсор поддерживается автоматически) |
||
DROP VIEW |
Режим конструктора запросов |
||
FETCH |
Поля в форме или отчете |
||
GRANT, PRIVILEGES, REVOKE |
Диалоговое окно прав доступа |
||
ROLLBACK |
Метод Access VBA RollbackTrans |
||
TRANSACTION |
Методы транзакций в Access VBA |
||
VALUES |
Значения, введенные в таблицы или формы |
||
WORK |
Метод Access VBA BeginTrans |
||
Access |
ANSI SQL |
||
; And |
AND |
||
Avg ( ) |
AVG() |
||
Between |
BETWEEN |
||
Count ( ) |
COUNT |
||
Is |
IS |
||
Like |
LIKE |
||
Access |
ANSI SQL |
||
Мах( ) |
MAX() |
||
Min( ) |
MIN() |
||
Not |
NOT |
||
Null |
NULL |
||
Or |
OR |
||
Sum( ) |
SUM |
||
Функция Access IsNull(), возвращающая значение True (-1), если ее аргумент равен лустому значению, и False (0) — в обратном случае, не имеет эквивалента в ANSI SQL и не является заменой модификаторов is Null или is Not Null в предложении WHERE. Кроме того, Jet SQL не поддерживает статистические функции по подмножеству, аргументом которых является любое выражение с параметром DISTINCT, например AVG (DISTINCT имя__поля). В таких случаях требуется использовать параметр DISTINCTROW в инструкции SELECT. Выражения, в которых применяются операторы, такие как, например, And или Or, заключаются в инструкциях Jet SQL в скобки.
Оператор Between. . .And, который имеет синтаксис
<выражение> [NOT] Between <значение_1> And <значение_2>
по-разному трактуется в языках Jet SQL и ANSI SQL. В языке Jet SQL значение_1 может превышать значение_2; в ANSI SQL значение_1 должно быть меньше или равно значение_2.
Функция Access
|
Назначение
|
||
StdDev() |
Смещенное значение среднеквадратичного отклонения для выборки |
||
StdDevP ( ) |
Несмещенное значение среднеквадратичного отклонения для выборки |
||
Var () |
Значение смещенной дисперсии для выборки |
||
VarP ( ) |
Значение несмещенной дисперсии для выборки |
||
Типы данных ANSI SQL
|
Типы данных Jet SQL
|
Синоним
|
Примечание
|
||
BIT, BIT VARYING |
BINARY |
VARBINARY, BINARY VARYING BIT VARYING |
He является стандартным типом данных Access |
||
He поддерживается |
BIT |
BOOLEAN, LOGICAL, LOGICAL1, YESNO |
В Access эквивалентно типу данных Логический |
||
He поддерживается |
TINYINT |
INTEGER 1, BYTE |
Целое число длиной 1 байт |
||
He поддерживается |
COUNTER |
AUTOINCREMENT |
|
||
He поддерживается |
MONEY |
CURRENCY |
В Access эквивалентно типу данных Денежный |
||
DATE, TIME, TIMESTAMP |
DATETIME |
DATE, TIME |
В Access эквивалентно типу данных Дата/Время |
||
He поддерживается |
UNIQUEIDEN TIFIER |
QUID |
|
||
DECIMAL |
DECIMAL |
NUMERIC, DEC |
|
||
REAL |
REAL |
SINGLE, FLOAT4, IEEESINGLE |
Тип данных Числовой (с плавающей точкой, 4 байта) |
||
DOUBLE PRECISION, FLOAT |
FLOAT |
DOUBLE, FLOATS, IEEEDOUBLE, NUMBER |
Тип данных Числовой (с плавающей точкой, 8 байтов) |
||
SMALLINT |
SMALLINT |
SHORT, INTEGER2 |
Тип данных Числовой (2 байта) |
||
INTEGER |
INTEGER |
LONG, INT, INTEGER4 |
Тип данных Числовой (длинное целое) |
||
INTERVAL |
He поддерживается |
|
|
||
He поддерживается |
IMAGE |
LONGBINARY, GENERAL, OLEOBJECT |
Тип данных поля объекта OLE |
||
He поддерживается |
TEXT |
LONGTEXT, LONGCHAR, MEMO, NOTE, NTEXT |
Тип данных Поле Memo |
||
CHARACTER, CHARACTER VARYING, NATIONAL CHARACTER, NATIONAL CHARACTER VARYING |
CHAR |
TEXT(n), ALPHANUMERIC, CHARACTER, STRING, VARCHAR, CHARACTER VARYING, NCHAR, NATIONAL CHARACTER, NATIONAL CHAR, NATIONAL CHARACTER VARYING, NATIONAL CHAR VARYING |
Тип данных Текстовый |
||
Реализация SQL процессора Jet
4.x
имеет существенные отличия в типах данных от предыдущей версии Jet SQL, а именно:
Jet SQL |
ANSI SQL |
Примечание |
||
? |
(подчеркивание) |
Любой одиночный символ |
||
* |
% |
Произвольное количество символов |
||
# |
He имеет эквивалента |
Любая цифра от 0 до 9 |
||
[список_знаков] |
Не имеет эквивалента |
Любой одиночный знак, входящий в
список знаков |
||
[! список_знаков] |
Не имеет эквивалента |
Любой одиночный знак, не входящий в список знаков |
||
Язык SQL Microsoft Jet поддерживает использование в операторе Like как
подстановочных знаков
ANSI SQL (_ и #), так и подстановочных знаков ядра Microsoft Jet (? и *). Однако подстановочные знаки ANSI SQL доступны только в режиме ANSI SQL-92, в противном случае они воспринимаются просто как строковые константы. И наоборот, в режиме ANSI SQL-92 подстановочные знаки Jet SQL трактуются как строковые константы. Таким образом, нельзя в одном запросе смешивать эти знаки.
Ниже перечислены важные правила установления совпадения оператором Like.
Управляющие запросы относятся к третьему типу запросов, которые создаются в окне
Режим SQL
и используют инструкции Jet SQL. Такие запросы позволяют работать с таблицами и индексами — создавать, изменять и удалять таблицы, создавать индексы.
Инструкции SQL, которые при этом используются, относятся к подмножеству SQL, называющемуся DDL — язык определения данных. Набор этих инструкций в Jet SQL существенно сокращен по сравнению со стандартом ANSI SQL, т. к. многие операции можно выполнить с помощью других средств (команд меню или окна базы данных).
В обычном режиме можно использовать следующие инструкции SQL:
CREATE TABLE — создает таблицу;
В режиме ANSI SQL-92 возможны дополнительно следующие инструкции:
Замечание
Запросы данного типа обычно используются в программах на языке Visual Basic для приложений (VBA) тогда, когда нужно выполнить соответствующие операции программно. В противном случае для этого гораздо удобнее и быстрее применять средства пользовательского интерфейса Access.
В рамках данной книги мы не описываем подробно синтаксис всех инструкций SQL. Заинтересованному читателю рекомендуется обратиться к разделу Справочник Microsoft Jet SQL Справочной системы Access.
Первый запрос, который мы предлагаем построить, должен ответить на вопрос: "Сколько заказов и на какую сумму разместил каждый клиент?". Для этого нам придется построить многотабличный запрос. Воспользуемся уже существующим в базе данных "Борей" запросом "Сведения о заказах" (Oreder Details Extended), а также таблицами "Клиенты" (Customers) и "Заказы" (Orders):
В предыдущем примере расчеты производились над всеми имеющимися в таблице "Заказы" (Orders) записями. Однако часто требуется выполнить вычисления над определенным набором данных и, основываясь на них, составить статистику. Для этого нужно добавить в запрос условия для выборки нужного набора записей. Например, мы можем изменить предыдущий запрос таким образом, чтобы получить данные не по всем клиентам, а только по тем, которые находятся в Германии. Для этого:
В ней используются две статистические функции— Count () и Sum () — и предложение WHERE, содержащее условие отбора записей.
Выполнение запроса на изменение приведет к появлению новой таблицы с запися--ми, которые будут идентичны результирующему набору записей того запроса на изменение, который был создан на первом этапе.
Для выполнения запроса:
Внимание
Одно из важных правил во время работы с запросами на изменение — нужно обязательно создавать резервную копию таблицы, в которую вносятся изменения. Дело в том, что исправления, внесенные запросами на изменение, необратимы, к тому же часто нелегко обнаружить записи, измененные ошибочным запросом.
Мы говорили о новых режимах, которые появились в Microsoft Access 2002 для просмотра содержимого таблиц и результатов запросов. И хотя сводные таблицы и диаграммы, получаемые в Access, немного отличаются от своих аналогов в Microsoft Excel, тем не менее, это уже большой шаг в усовершенствовании средств для анализа данных.
В последних разделах главы мы привели описание языка Jet SQL. Возможно, это изложение показалось вам недостаточно полным. Однако применение языка Jet SQL в приложениях Access все-таки является достаточно ограниченным. В большинстве случаев для создания запросов можно использовать графический интерфейс Конструктора запросов. И даже при написании программ на VBA, в которых используются инструкции SQL, можно сначала построить нужный запрос в Конструкторе, а потом просто скопировать его через буфер обмена из окна
Режим SQL
Конструктора запросов. Читателю, желающему основательно изучить SQL, мы рекомендуем обратиться к специальной литературе.
В дальнейших главах нашей книги мы будем рассматривать запросы для создания других объектов Access: форм, отчетов, страниц доступа к данным.
Зарезервированные слова DISTINCTROW и DISTINCT в инструкции SELECT Jet SQL позволяют исключить из результирующего множества повторяющиеся строки. Разница между этими словами состоит в том, как при их использовании определяются повторяющиеся записи.
Если в инструкции SELECT используется слово DISTINCTROW, то для сравнения записей применяются все поля исходной таблицы, независимо от того, какие из этих полей включены в запрос.
Если в инструкцию SELECT входит слово DISTINCT, то для сравнения записей используются данные в строках результирующего множества запроса, т. е. только те поля, которые включены в запрос.
Замечание
Модификаторы могут использоваться не только в инструкции SELECT, но также и в запросах на добавление записей и на создание таблицы.
Для того чтобы понять, как влияет включение этих слов в запрос на его результат, построим запрос, который будет показывать, какие товары приобрел каждый клиент:
Вы должны получить результирующее множество, которое содержит 2169 записей. При этом те клиенты, которые не сделали ни одного заказа, в результирующее множество .не попадут, однако клиенты, которые заказывали один и тот же товар несколько раз, могут попасть в таблицу несколько раз. Теперь добавим в инструкцию SQI, SELECT слово DISTINCTROW для зтого:
Приведенные здесь таблицы предназначены для сравнения зарезервированных слов ANSI SQL и Jet SQL.
Ниже перечисляются зарезервированные слова Jet SQL, которые идентичны зарезервированным словам ANSI SQL (знаком звездочки помечены слова, которые доступны только в режиме ANSI SQL-92):
ADD |
COMMIT* |
FETCH* |
MAX |
ROLLBACK* |
||
ALL |
CONSTRAINT |
FROM |
MIN |
SELECT |
||
ALTER |
COUNT |
FOREIGN |
NOT |
SET |
||
ANY |
CREATE |
GRANT* |
NULL |
SOME |
||
ALIAS |
CREATE VIEW* |
HAVING |
ON |
TRANSACTION* |
||
AS |
CURRENT* |
IN |
OR |
UNION |
||
ASC |
CURSOR* |
INDEX |
ORDER |
UNIQUE |
||
AUTHORAZATI ON* |
DECLARE* |
INNER |
OUTER |
UPDATE |
||
AVG |
DELETE |
INSERT |
PARAMETERS |
VALUE |
||
BEGIN* |
DESC |
INTO |
PRIMARY |
VALUES |
||
BETWEEN |
DISALLOW |
IS |
PRIVILEGES* |
WHERE |
||
BY |
DISTINCT |
JOIN |
PROCEDURE |
WORK* |
||
CHECK* |
DROP |
KEY |
REFERENCES |
|
||
CLOSE* |
DROP VIEW* |
LEFT |
REVOKE* |
|
||
COLUMN |
EXISTS |
LIKE |
RIGHT |
|
||
Зарезервированные слова, обозначающие типы данных, не включены в этот список, т. к. соответствие типов данных ANSI SQL и Jet SQL приводится ниже, в табл. 8.6. Большинство операторов сравнения в ANSI SQL и Jet SQL совпадают: =, <, <=, > и =>. Исключение составляет оператор неравенства. Оператору неравенства ! = в ANSI SQL соответствует оператор <> в Jet SQL.
Как и в ANSI SQL, зарезервированное слово Jet SQL IN может быть использовано для задания списка значений в предложении WHERE или списка, созданного подчиненным запросом. Оператор IN также может использоваться для идентификации таблицы в другой базе данных.
Хотя в последней версии Jet SQL появились новые инструкции, связанные с обработкой транзакций (раньше они реализовывались с помощью процедур VBA), тем не менее существует отличие в механизме выполнения транзакции от рекомендуемого ANSI SQL:
В обычном режиме ряд инструкций ANSI SQL не поддерживается, однако их можно реализовать другими средствами Access: меню, кнопками, диалоговыми окнами. В табл. 8.3 приведен список инструкций ANSI SQL и эквивалентные им средства Access.
Существует несколько зарезервированных слов Jet SQL, которые не имеют аналогов в ANSI SQL. Это слова:
Кроме того, Jet позволяет использовать четыре статистические функции по подмножеству, не включенные в ANSI SQL (табл. 8.5).