В этой статье объясняется, как использовать запрос основных значений в Access для поиска самых последних или ранних дат в наборе записей. Результаты можно использовать для ответа на деловые вопросы, например, когда клиент в последний раз размещал заказ.
Выберите нужное действие
- Сведения о работе запросов на набор значений с датами
- Поиск самой последней или самой давней даты
- Поиск самых последних или самых давних дат для записей в категории или группе
- Одновременный поиск самых последних и самых давних дат
Сведения о работе запросов на набор значений с датами
Запросы на набор значений используются, когда возникает необходимость найти в таблице или группе записи, содержащие самую последнюю или самую давнюю дату. Полученные данные позволят отвечать на различные деловые вопросы, например следующие:
- Когда сотрудник в последний раз продавал товар? Ответ на этот вопрос поможет вам определить наиболее продуктивного или наименее продуктивного сотрудника.
- Когда клиент делал заказ в последний раз? Если в течение определенного периода заказов не было, его можно перенести в список неактивных клиентов.
- У кого следующий день рождения или следующие n дней рождения?
Правила создания и использования запросов на набор значений
Для создания запроса на получение наилучших значений сначала нужно создать запрос на выборку. В зависимости от требуемых результатов к запросу можно применить порядок сортировки или преобразовать его в итоговый запрос. При преобразовании запроса используется агрегатная функция, например Max "или Min ", для возвращения наибольшего или наименьшего значения или First "или" Last для возврата самой ранней или самой большой даты. Используйте итоговые запросы и агрегатные функции только в том случае, если необходимо найти данные, которые попадают в группы или категории. Например, если вам нужно найти показатели продаж на определенную дату для каждого города присутствия компании, города преобразуются в категории, поэтому используется итоговый запрос.
Помните, что в запросах необходимо использовать поля, содержащие описательные данные, такие как имена клиентов, а также поле со значениями дат, которые нужно найти. Значения даты должны находиться в поле с этим типом Date/Time данных. Запросы, приведенные в этой статье, завершаются ошибкой, если выполнять их для значений дат в Short Text поле. Если вы хотите использовать итоговый запрос, поля данных должны также содержать сведения о категории, такие как поле города или страны или региона.
Выбор между запросом на набор значений и фильтром
Чтобы определить, стоит ли создавать запрос на набор значений или же следует применить фильтр, примите во внимание следующее:
- Если вы хотите получить записи, в полях которых содержатся самые последние или самые давние даты, а точные значения дат неизвестны или не имеют значения, следует создать запрос на набор значений.
- Если вы хотите получить все записи, в которых даты совпадают с определенной датой, предшествуют ей или следуют за ней, используйте фильтр. Например, для просмотра дат продаж между апрелем и июлем нужно применить фильтр. Подробное обсуждение фильтров выходит за пределы данной темы. Дополнительные сведения о создании и использовании фильтров см. в статье "Применение фильтра для просмотра отдельных записей в базе данных Access".
Поиск самой последней или самой давней даты
Шаги, описанные в этом разделе, объясняют, как создать базовый запрос на получение высших значений, использующий порядок сортировки, и более сложный запрос, использующий выражения и другие условия. В первой части описаны основные действия по созданию запроса на основные значения. Во второй части объясняется, как найти несколько следующих дней рождения сотрудников, добавив условия. Используются данные из следующей таблицы.
| Фамилия | Имя | Адрес | Город | Страна или регион | Дата рождения | Дата приема на работу |
|---|---|---|---|---|---|---|
| Авдеев | Григорий | Загородное шоссе, д. 150 | Москва | РФ | 05-фев-1968 | 10-июн-1994 |
| Кузнецов | Артем | ул. Гарибальди, д. 170 | Пермь | РФ | 22-май-1957 | 22-ноя-1996 |
| Дегтярев | Дмитрий | ул. Кедрова, д. 54 | Красноярск | РФ | 11-ноя-1960 | 11-мар-2000 |
| Зуева | Ольга | ул. Губкина, д. 233 | Тверь | РФ | 22-мар-1964 | 22-июн-1998 |
| Белых | Николай | пл. Хо Ши Мина, д. 15, кв. 5 | Москва | РФ | 05-июн-1972 | 05-янв-2002 |
| Комарова | Лина | ул. Ляпунова, д. 70, кв. 16 | Красноярск | РФ | 23-янв-1970 | 23-апр-1999 |
| Зайцев | Сергей | ул. Строителей, д. 150, кв. 78 | Омск | РФ | 14-апр-1964 | 14-окт-2004 |
| Ермолаева | Анна | ул. Вавилова, д. 151, кв. 8 | Иркутск | РФ | 29-окт-1959 | 29-мар-1997 |
При необходимости вы можете ввести образец данных в новую таблицу вручную или скопировать образец таблицы в программу для работы с электронными таблицами, например Microsoft Excel, а затем импортировать полученный лист в таблицу с помощью Access.
Создание простого запроса на набор значений
На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
В диалоговом окне щелкните таблицу, которую вы хотите использовать в запросе, нажмите Добавить, чтобы поместить ее в верхний раздел конструктора запросов, и нажмите кнопку Закрыть. Или дважды щелкните таблицу и нажмите кнопку Закрыть. Если вы используете образец данных, приведенный в предыдущем разделе, добавьте таблицу
Employeesв запрос.Добавьте на бланк поля, которые вы хотите использовать в запросе. Вы можете дважды щелкнуть каждое поле или перетащить его в пустую ячейку в строке Поле. Если вы работаете с примером таблицы, то добавьте поля "Фамилия", "Имя" и "Дата рождения".
В поле, которое содержит искомые наибольшие или наименьшие значения (при использовании примера таблицы — поле "Дата рождения), в строке Сортировка выберите порядок сортировки По возрастанию или По убыванию. При сортировке по убыванию будут возвращены самые последние даты, при сортировке по возрастанию — самые давние.
Важно
В строке Сортировка следует установить значение только для полей, содержащих даты. Если порядок сортировки задан по другому полю, запрос не вернет ожидаемых результатов.
На вкладке "Конструктор запросов " в группе "Настройка запроса " щелкните стрелку вниз рядом с "Все " в списке "Лучшие значения ". Затем введите количество записей, которые хотите просмотреть, или выберите вариант из списка.
Нажмите кнопку "Выполнить", чтобы выполнить запрос и отобразить результаты в режиме таблицы.
Сохраните запрос и оставьте его открытым, чтобы использовать на следующих шагах.
Как вы видите, этот тип запросов на набор значений дает ответы на основные вопросы, например "Кто из сотрудников самый старший или самый молодой?". Ниже описано, как с помощью выражений и других условий создавать более точные и гибкие запросы. Запрос по описанным ниже условиям выдает ближайшие дни рождения у трех сотрудников.
Добавление условий в запрос
Примечание
В этих инструкциях предполагается, что вы используете запрос, описанный в предыдущем разделе.
- Откройте запрос, созданный на предыдущих шагах, в Конструкторе.
- В бланке запроса справа от столбца " Дата рождения " скопируйте и вставьте или введите следующее выражение:
Expr1: DatePart("m",[Birth Date]). Затем выберите "Выполнить". ФункцияDatePartизвлекает часть месяца в поле "Дата рождения ". - Переключитесь в Конструктор.
- Справа от первого выражения вставьте или введите следующее выражение:
Expr2: DatePart("d",[Birth Date]). Затем выберите "Выполнить". В этом случаеDatePartфункция извлекает часть дня поля "Дата рождения ". - Переключитесь в Конструктор.
- Для обоих введенных выражений снимите флажки в строке Показать, щелкните строку Сортировка и выберите пункт По возрастанию.
- Выберите команду Выполнить.
- При необходимости вы можете указать условия для ограничения области запроса. После этого запрос будет сортировать только записи, удовлетворяющие им, и определять первые или последние значения полей из отсортированного списка.
Для продолжения работы с примером данных откройте Конструктор. Затем в строке Условия отбора столбца Дата рождения введите следующее выражение:
Month([Birth Date]) > Month(Date()) Or Month([Birth Date]) = Month(Date()) And Day([Birth Date]) > Day(Date())Это выражение работает следующим образом: ЭтотMonth([Birth Date]) > Month(Date())фрагмент проверяет дату рождения каждого сотрудника, чтобы узнать, выпадает ли она на будущий месяц. Если да, запрос включает эту запись. ЭтотMonth([Birth Date]) = Month(Date()) And Day([Birth Date]) > Day(Date())фрагмент проверяет даты рождения в текущем месяце, чтобы узнать, выпадает ли день рождения на текущий день или следует за ним. Если да, запрос включает эту запись. Короче говоря, это выражение игнорирует все записи, день рождения которых приходится на период между 1 января и днем выполнения запроса. Другие примеры выражений условий для запросов можно найти в статье Примеры условий запроса. - На вкладке "Конструктор запросов " в группе "Настройка запроса " щелкните стрелку вниз рядом с "Все " в списке "Лучшие значения ". Затем введите количество записей, которые хотите просмотреть, или выберите вариант из списка.
Чтобы увидеть следующие три дня рождения, введите
3. - Нажмите кнопку "Выполнить", чтобы выполнить запрос и отобразить результаты в режиме таблицы.
Если отображается больше записей, чем требовалось
Если в данных есть записи с одинаковым значением даты, запрос может возвращать больше записей, чем вы указали. Например, вы можете создать запрос на набор значений для получения записей о трех сотрудниках, н запрос вернет четыре, поскольку у Измайлова и Быкова дни рождения совпадают, как указано в следующей таблице.
| Фамилия | ДатаРождения |
|---|---|
| Белых | 26.09.1968 |
| Бутусов | 02.10.1970 |
| Измайлов | 15.10.1965 |
| Быков | 15.10.1969 |
Если отображается меньше записей, чем требовалось
Предположим, что вы создали запрос, возвращающий наибольшие или наименьшие пять записей в поле, но он возвращает только три. Как правило, чтобы решить эту проблему, нужно открыть запрос в Конструкторе и проверить строку Условия отбора для столбцов в бланке запроса.
Дополнительные сведения об условиях см. в статье Примеры условий запроса.
Если выводятся повторяющиеся записи
Если запрос на набор значений возвращает повторяющиеся значения, то либо базовые таблицы содержат повторяющиеся записи, либо записи отображаются как одинаковые, потому что запрос не включает поля, значения которых позволяют их различить. Например, в следующей таблице показан результат запроса, отображающего пять последних отгруженных заказов вместе с именем продавца, который проводил транзакцию.
| Дата поставки | Продавец |
|---|---|
| 12.11.2004 | Ковалев |
| 12.11.2004 | Маслов |
| 12.10.2004 | Попов |
| 12.10.2004 | Попов |
| 12.10.2004 | Ковалев |
Третья и четвертая записи кажутся одинаковыми, но это может объясняться тем, что Попов обработал два различных заказа, отгруженных в один день.
Чтобы избежать отображения повторяющихся записей, можно выполнить одно из двух действий в зависимости от требуемого результата. Вы можете изменить структуру запроса, добавив поля, которые позволят различить записи, например поля "КодЗаказа" и "КодКлиента". Или, если достаточно показать только одну из повторяющихся записей, вы можете выбрать отображение только уникальных записей, задав значение Да для свойства запроса Уникальные значения. Чтобы задать значение этого свойства, в Конструктор щелкните правой кнопкой мыши в любом свободном месте в верхней половине окна конструктора запросов и выберите в контекстном меню команду Свойства. В окне свойств найдите свойство Уникальные значения и задайте для него значение Да.
Дополнительные сведения о работе с дублирующимися записями см. в статье Поиск дубликатов записей с помощью запроса.
Поиск самых последних или самых давних дат для записей в категории или группе
Для поиска самых последних или самых давних дат для записей, входящих в группы или категории, используются итоговые запросы. Итоговый запрос — это запрос на выборку, в котором используются агрегатные функции, SumFirstтакие как Min, Max, для Last вычисления значений заданного поля.
Шаги, описанные в этом разделе, предполагают, что вы занимаетесь организацией организации мероприятий. Вы занимаетесь постановкой, освещением, кейтерингом и другими частями больших функций. Мероприятия, которыми вы управляете, делятся на несколько категорий, например запуск продуктов, уличные ярмарки и концерты. Шаги в этом разделе объясняют, как ответить на распространенный вопрос: когда будет следующее событие по категориям? Другими словами, когда будет следующий запуск продукта, следующий концерт и так далее?
При этом учитывайте следующее: По умолчанию тип итогового запроса, создаваемого здесь, может включать только поле, содержащее данные группы или категории, и поле, содержащее ваши даты. Невозможно включить другие поля, описывающие элементы категории, такие как имена клиентов или поставщиков. Однако вы можете создать второй запрос, в котором будут содержаться итоговые запросы и поля с описательными данными. Ниже описано, как это сделать.
Инструкции в данном разделе предполагают использование следующих трех таблиц:
Таблица "Типы мероприятий"
| КодТипа | Тип мероприятия |
|---|---|
| 1 | Презентация товара |
| 2 | Корпоративное мероприятие |
| 3 | Частное мероприятие |
| 4 | Мероприятие по сбору средств |
| 5 | Выставка-продажа |
| 6 | Лекция |
| 7 | Концерт |
| 8 | Выставка |
| 9 | Уличная ярмарка |
Таблица "Клиенты"
| КодКлиента | Компания | Контакт |
|---|---|---|
| 1 | Contoso, Ltd. НИИ | Николай Белых |
| 2 | Лесопитомник | Регина Покровская |
| 3 | Fabrikam | Елена Матвеева |
| 4 | Лесопитомник | Афанасий Быков |
| 5 | А. Datum | Лилия Медведева |
| 6 | Adventure Works | Максим Измайлов |
| 7 | железа | Арина Иванова |
| 8 | Художественная школа | Полина Кольцова |
Таблица "Мероприятия"
| КодМероприятия | Тип мероприятия | Клиент | Дата мероприятия | Цена |
|---|---|---|---|---|
| 1 | Презентация товара | Contoso, Ltd. | 14.04.2003 | 10 000 ₽ |
| 2 | Корпоративное мероприятие | Лесопитомник | 21.04.2003 | 8000 ₽ |
| 3 | Выставка-продажа | Лесопитомник | 01.05.2003 | 25000 ₽ |
| 4 | Выставка | НИИ железа | 13.05.2003 | 4 500 ₽ |
| 5 | Выставка-продажа | Contoso, Ltd. | 14.05.2003 | 55 000 ₽ |
| 6 | Концерт | Художественная школа | 23.05.2003 | 12 000 ₽ |
| 7 | Презентация товара | А. Datum | 01.06.2003 | 15 000 ₽ |
| 8 | Презентация товара | Лесопитомник | 18.06.2003 | 21 000 ₽ |
| 9 | Мероприятие по сбору средств | Adventure Works | 22.06.2003 | 1300 ₽ |
| 10 | Лекция | НИИ железа | 25.06.2003 | 2450 ₽ |
| 11 | Лекция | Contoso, Ltd. | 04.07.2003 | 3800 ₽ |
| 12 | Уличная ярмарка | НИИ железа | 04.07.2003 | 5500 ₽ |
Примечание
В этом разделе предполагается, что таблицы "Клиенты " и "Тип события " находятся на стороне "один" связей "один-ко-многим" с таблицей "События ". В этом случае в таблице "События " используются общие поля and CustomerIDTypeID . Итоговые запросы, описанные в следующих разделах, не будут работать без этих связей.
Как добавить эти данные в базу данных?
Чтобы добавить эти примеры таблиц в базу данных, вы можете скопировать данные в Excel, а затем импортировать данные, но с некоторыми исключениями.
- При копировании таблиц "Типы событий " и "Клиенты " в Excel не копируйте
TypeIDстолбцы andCustomerID. При импорте листов Access автоматически добавляет значения первичного ключа, что позволяет сэкономить время. - После импорта таблиц нужно открыть таблицу "События " в режиме конструктора и преобразовать столбцы "Тип события " и "Клиент " в поля подстановки. Для этого выберите столбец " Тип данных " для каждого поля, а затем выберите пункт "Мастер подстановок". В ходе создания полей подстановки Access заменяет текстовые значения столбцов "Тип мероприятия" и "Клиент" числовыми значениями из исходных таблиц. Дополнительные сведения о создании и использовании полей подстановки см. в статьях Создание и удаление многозначного поля. В этой статье объясняется, как создать тип поля подстановки, позволяющий выбрать несколько значений для одного поля, а также как создавать списки подстановки.
Создание итогового запроса
На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
Дважды щелкните таблицы, которые нужно использовать. Таблицы появятся в верхней части конструктора запросов. При использовании приведенных выше примеров добавьте таблицы "Мероприятия" и "Типы мероприятий".
Дважды щелкните поля таблицы, которые вы хотите использовать в запросе. На данном этапе к запросу следует добавить только поля категорий или групп и поле значений. При использовании данных из трех приведенных выше таблиц следует добавить либо поле "Тип мероприятия" из таблицы "Типы мероприятий", либо поле "Дата мероприятия" из таблицы "Мероприятия".
При необходимости вы можете указать условие для ограничения области запроса. Сортироваться будут только записи, удовлетворяющие этому условию, и в отсортированном списке будут определены первые и последние значения полей. Например, если вы хотите возвращать события в категории "Приватная функция", введите следующее выражение в строке "Условие " столбца "Тип события ":
<>"Private Function". Другие примеры выражений условий для запросов можно найти в статье Примеры условий запроса.Преобразовать запрос в итоговый запрос, выполнив указанные ниже действия. На вкладке "Конструктор запросов " в группе "Показать или скрыть " нажмите кнопку "Итоги". В бланке запроса появится строка Итоги.
Убедитесь, что в строке Итоги поля каждой группы или категории выбран пункт Группировка по, и выберите для строки Итоги поля значения (поля с наибольшими или наименьшими значениями) функцию Max или Min.
MaxВозвращает наибольшее значение числового поля и последнее значениеDate/Timeдаты или времени в поле.MinВозвращает наименьшее значение числового поля и самое раннее значениеDate/Timeдаты или времени в поле.На вкладке "Конструктор запросов " в группе "Настройка запроса " щелкните стрелку вниз рядом с "Все " в списке "Лучшие значения ". Затем введите количество записей, которые хотите просмотреть, или выберите вариант из списка. В этом случае для просмотра результатов в режиме таблицы выберите параметр Все и нажмите кнопку Выполнить.
Примечание
В зависимости от функции, выбранной на шаге 6, Access изменяет имя поля значений в запросе на MaxOfFieldName или MinOfFieldName. В нашем примере поле будут переименовано в Максимум_Дата мероприятия или Минимум_Дата мероприятия.
Сохраните запрос и переходите к следующим шагам.
Запрос не возвращает названия продуктов и другую информацию о них. Чтобы просмотреть дополнительные данные, необходимо создать второй запрос, который включает в себя запрос, который вы только что создали. Далее описано, как это сделать.
Создание второго запроса для отображения более подробных данных
- На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
- Перейдите на вкладку "Запросы " и дважды щелкните итоговый запрос, созданный в предыдущем разделе.
- Откройте вкладку Таблицы и добавьте таблицы, которые вы использовали в итоговом запросе, а также таблицы, в которых содержатся дополнительные данные. Если вы использовали три таблицы из примера, добавьте в новый запрос таблицы "Типы мероприятий", "Мероприятия" и "Клиенты".
- Свяжите поля в итоговом запросе с соответствующими полями в родительских таблицах. Для этого перетащите каждое поле из итогового запроса на соответствующее поле в таблице. Если вы используете образец данных из трех таблиц, перетащите столбец "Тип события " в итоговом запросе в поле "Тип события " в таблице "Тип события ". Затем перетащите столбец "Дата MaxOfEvent " в итоговом запросе в поле "Дата события " в таблице "События ". Эти соединения позволяют объединить данные итогового запроса и данные других таблиц.
- Добавьте в запрос поля с дополнительной информацией из других таблиц. При использовании примеров данных из трех таблиц можно добавить поля "Компания" и "Контакт" из таблицы "Клиенты".
- При желании вы можете задать порядок сортировки по одному или нескольким столбцам. Например, для вывода категорий в алфавитном порядке задайте в строке Сортировка столбца Тип мероприятия значение По возрастанию.
- На вкладке "Конструктор запросов " в группе "Результаты " нажмите кнопку "Выполнить". Результаты запроса отображаются в режиме таблицы.
Совет.
Если вы не хотите, чтобы заголовок столбца "Цена " отображался как "MaxOfPrice " или "MinOfPrice", откройте запрос в Конструкторе и в столбце "Цена" в сетке введите Price: MaxOfPrice или Price: MinOfPrice. В режиме таблицы в заголовке столбца отображается "Цена".
Одновременный поиск самых последних и самых давних дат
Запросы, созданные ранее в этой статье, возвращают либо наибольшие, либо наименьшие значения, но не оба набора сразу. Если вы хотите просмотреть оба набора значений в одном представлении, создайте два запроса: один из них будет получать максимальные значения, а другой — минимальные. Затем объедините и сохраните результаты в одной таблице.
Поиск наибольших и наименьших значений и отображение этих данных в таблице состоит из следующих основных этапов:
Создайте запросы на получение наилучших и последних значений. Чтобы сгруппировать данные, создайте итоговые запросы с функциями
MinandMax.Преобразуйте запрос основных значений или
Maxитоговый запрос в запрос на создание таблицы и создайте новую таблицу.Преобразуйте запрос о последних значениях или
Minитоговый запрос в запрос на добавление и добавьте записи в таблицу основных значений. Инструкции по выполнению этого действия описаны в этих разделах.- Создайте запросы на поиск наибольших и наименьших значений. Шаги, необходимые для создания запроса на поиск наибольших или наименьших значения, описаны выше в разделе Поиск самой последней или самой давней даты. Если нужно сгруппировать записи по категориям, обратитесь к разделу Поиск самых последних или самых давних дат для записей в категории или группе. Если используются таблицы примеров из предыдущего раздела, используйте только данные из таблицы "Мероприятия". Используйте в обоих запросах поля "Тип мероприятия", "Клиент" и "Дата мероприятия" из таблицы "Мероприятия".
- Сохраните оба запроса, присвоив им описательные имена, например "Наибольшее значение" и "Наименьшее значение", и оставьте их открытыми для использования на следующих этапах.
Создание запроса на создание таблицы
- Открыв запрос к максимальным значениям в Конструкторе: на вкладке "Конструктор запросов " в группе "Тип запроса " нажмите кнопку "Создать таблицу". Откроется диалоговое окно Создание таблицы.
- В поле Имя таблицы введите имя таблицы, которая будет хранить записи с наибольшими и наименьшими значениями. Например, введите
Top and Bottom Records, а затем нажмите кнопку ОК. Каждый раз при выполнении запроса вместо отображения результатов в режиме таблицы запрос будет создавать таблицу и замещать значения текущими данными. - Сохраните и закройте запрос.
Создание запроса на добавление
- Запрос с наименьшим значением в Конструкторе: на вкладке "Конструктор запросов " в группе "Тип запроса " нажмите кнопку "Добавить".
- Откроется диалоговое окно Добавление.
- Введите то же имя, которое вы указали в диалоговом окне Создание таблицы.
Например, введите
Top and Bottom Records, а затем нажмите кнопку ОК. Каждый раз при выполнении запроса записи добавляются в таблицуTop and Bottom Recordsвместо отображения его результатов в режиме таблицы. - Сохраните и закройте запрос.
Выполнение запросов
- Теперь вы готовы выполнить два запроса. В области навигации дважды щелкните запрос с первым значением и выберите "Да " в ответ на запрос. Затем дважды щелкните запрос "Наименьшее значение " и выберите "Да " в ответ на запрос.
- Откройте таблицу "Последние и верхние записи " в режиме таблицы.
Важно
Если при попытке выполнения запроса на создание или добавление ничего не происходит, проверьте, не появляется ли в строке состояния Access следующее сообщение:
Данное действие или событие заблокировано в режиме отключения.
Если выводится это сообщение, сделайте следующее:
- Выберите "Включить это содержимое", а затем нажмите кнопку "ОК".
- Выполните запрос еще раз.