В этой статье объясняется, как использовать запросы с наибольшими значениями и запросы итогов для поиска самых последних или самых ранних дат в наборе записей. Это поможет вам ответить на различные бизнес-вопросы, например, когда клиент в последний раз разместил заказ или какие пять кварталов были лучшими для продаж, по городам.
В этой статье
Обзор
Вы можете ранжировать данные и просмотреть элементы с самым высоким рейтингом с помощью запроса с наибольшими значениями. Запрос с наибольшим значением — это запрос на выборку, который возвращает указанное число или процент значений из верхней части результатов, например пять самых популярных страниц на веб-сайте. Вы можете использовать запрос к верхним значениям любого типа — они не должны быть числами.
Если вы хотите группировать или суммировать данные перед их ранжированием, вам не нужно использовать запрос с верхними значениями. Предположим, что нужно найти объем продаж за указанную дату для каждого города, в котором работает компания. В этом случае города становятся категориями (необходимо собрать данные по городам), поэтому можно использовать итоговый запрос.
При использовании запроса к верхним значениям для поиска записей, содержащих последние или самые ранние даты в таблице или группе записей, можно ответить на различные бизнес-вопросы, например следующие:
-
Кто делает больше всего продаж в последнее время?
-
Когда клиент делал заказ в последний раз?
-
Когда следующие три дня рождения в команде?
Чтобы создать запрос с верхним значением, начните с создания запроса на выборку. Затем отсортируйте данные в соответствии с вашим вопросом, независимо от того, ищете ли вы верхнюю или нижнюю. Если необходимо сгруппировать или свести данные, превратите запрос select в запрос итогов. Затем можно использовать агрегатную функцию, например Max или Min , чтобы вернуть наибольшее или наименьшее значение, или First или Last , чтобы вернуть самую раннюю или последнюю дату.
В этой статье предполагается, что используемые значения даты имеют тип данных Date/Time. Если значения даты находятся в текстовом поле, .
Рассмотрите возможность использования фильтра вместо запроса с верхними значениями
Фильтр обычно лучше, если вы имеете в виду определенную дату. Чтобы определить, стоит ли создавать запрос на набор значений или же следует применить фильтр, примите во внимание следующее:
-
Если вы хотите вернуть все записи, в которых дата совпадает, находится до определенной даты или позже определенной даты, используйте фильтр. Например, для просмотра дат продаж между апрелем и июлем нужно применить фильтр.
-
Если вы хотите вернуть указанное количество записей с самыми последними или последними датами в поле, а точные значения даты не известны или они не имеют значения, создайте запрос на самые верхние значения. Например, чтобы просмотреть пять лучших кварталов продаж, используйте запрос с максимальными значениями.
Дополнительные сведения о создании и использовании фильтров см. в статье Применение фильтра для просмотра избранных записей в базе данных Access.
Подготовка примеров данных для выполнения вместе с примерами
В шагах, описанных в этой статье, используются данные из следующих примеров таблиц.
Таблица Employees
|
Фамилия |
Имя |
Адрес |
Город |
CountryOrR egion |
Дата рождения |
Дата найма |
|
Авдеев |
Григорий |
Загородное шоссе, д. 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 |
Таблица EventType
|
КодТипа |
Тип события |
|
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. |
4/14/2011 |
10 000 ₽ |
|
2 |
Корпоративное мероприятие |
Лесопитомник |
4/21/2011 |
8000 ₽ |
|
3 |
Выставка-продажа |
Лесопитомник |
01.05.2011 |
25000 ₽ |
|
4 |
Выставка |
НИИ железа |
5/13/2011 |
4 500 ₽ |
|
5 |
Выставка-продажа |
Contoso, Ltd. |
5/14/2011 |
55 000 ₽ |
|
6 |
Концерт |
Художественная школа |
5/23/2011 |
12 000 ₽ |
|
7 |
Презентация товара |
А. Datum |
6/1/2011 |
15 000 ₽ |
|
8 |
Презентация товара |
Лесопитомник |
6/18/2011 |
21 000 ₽ |
|
9 |
Мероприятие по сбору средств |
Adventure Works |
6/22/2011 |
1300 ₽ |
|
10 |
Лекция |
НИИ железа |
6/25/2011 |
2450 ₽ |
|
11 |
Лекция |
Contoso, Ltd. |
04.07.2011 |
3800 ₽ |
|
12 |
Уличная ярмарка |
НИИ железа |
04.07.2011 |
5500 ₽ |
Примечание: Действия, описываемые в данном разделе, предполагают, что таблицы "Клиенты" и "Типы мероприятий" находятся на стороне "один" отношения "один-ко-многим" с таблицей "Мероприятия". В данном случае таблица "Мероприятия" имеет с этими таблицами общие поля "КодКлиента" и "КодТипа". Итоговые запросы, описанные в следующих разделах, не будут работать, если эти связи отсутствуют.
Вставка примера данных на листы Excel
-
Запустите Excel. Откроется пустая книга.
-
Нажмите клавиши SHIFT+F11, чтобы вставить лист (потребуется четыре).
-
Скопируйте данные из каждого примера таблицы на пустой лист. Включите заголовки столбцов (первая строка).
Создание таблиц базы данных на основе листов
-
Выберите данные с первого листа, включая заголовки столбцов.
-
Щелкните правой кнопкой мыши область навигации и выберите команду Вставить.
-
Нажмите кнопку Да , чтобы убедиться, что первая строка содержит заголовки столбцов.
-
Повторите шаги 1–3 для каждого оставшегося листа.
Поиск самой или последней даты
В шагах, описанных в этом разделе, используются примеры данных, чтобы проиллюстрировать процесс создания запроса с максимальными значениями.
Создание простого запроса на набор значений
-
На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
-
Дважды щелкните таблицу Сотрудники и нажмите кнопку Закрыть.
Если используется пример данных, добавьте в запрос таблицу "Сотрудники".
-
Добавьте на бланк поля, которые вы хотите использовать в запросе. Вы можете дважды щелкнуть каждое поле или перетащить его в пустую ячейку в строке Поле.
Если вы работаете с примером таблицы, то добавьте поля "Фамилия", "Имя" и "Дата рождения".
-
В поле, которое содержит искомые наибольшие или наименьшие значения (при использовании примера таблицы — поле "Дата рождения), в строке Сортировка выберите порядок сортировки По возрастанию или По убыванию.
При сортировке по убыванию будут возвращены самые последние даты, при сортировке по возрастанию — самые давние.
Важно: В строке Сортировка следует установить значение только для полей, содержащих даты. Если порядок сортировки задан по другому полю, запрос не вернет ожидаемых результатов.
-
На вкладке Конструктор в группе Сервис щелкните стрелку вниз рядом со значением Все (список Набор значений) и либо введите число записей, которые вы хотите просмотреть, либо выберите значение из списка.
-
Чтобы выполнить запрос и отобразить результаты в режиме таблицы, нажмите кнопку Выполнить
. -
Сохраните запрос как NextBirthDays.
Как вы видите, этот тип запросов на набор значений дает ответы на основные вопросы, например "Кто из сотрудников самый старший или самый молодой?". Ниже описано, как с помощью выражений и других условий создавать более точные и гибкие запросы. Запрос по описанным ниже условиям выдает ближайшие дни рождения у трех сотрудников.
Добавление условий в запрос
В этих шагах используется запрос, созданный в предыдущей процедуре. Вы можете выполнить запрос с другими значениями, если он содержит фактические данные даты и времени, а не текстовые значения.
Совет: Если вы хотите лучше понять, как работает этот запрос, на каждом шаге переключайтесь между режимами конструктора и таблицы. Если вы хотите просмотреть фактический код запроса, переключитесь в представление SQL. Чтобы переключаться между представлениями, щелкните правой кнопкой мыши вкладку в верхней части запроса и выберите нужное представление.
-
В области навигации щелкните правой кнопкой мыши запрос NextBirthDays и выберите пункт Конструктор.
-
В сетке конструктора запросов в столбце справа от BirthDate введите следующее:MonthBorn: DatePart("m",[BirthDate]))..Это выражение извлекает месяц из BirthDate с помощью функции DatePart .
-
В следующем столбце сетки конструктора запросов введите следующий код:DayOfMonthBorn: DatePart("d",[BirthDate])Это выражение извлекает день месяца из BirthDate с помощью функции DatePart .
-
Очистите поля проверка в строке Показать для каждого из двух только что введенных выражений.
-
Щелкните строку Сортировка для каждого выражения и выберите По возрастанию.
-
В строке Условия столбца Дата рождения введите следующее выражение:Month([Дата рождения]) > month(Date()) OR Month([Дата рождения])= Month(Date()AND Day([Дата рождения])>Day(Date())Это выражение делает следующее:
-
Month( [Дата рождения]) > Month(Date()) указывает, что дата рождения каждого сотрудника приходится на будущий месяц.
-
Month( [Дата рождения])= Month(Date()) And Day([Дата рождения])>Day(Date()) указывает, что если дата рождения приходится на текущий месяц, день рождения приходится на текущий день или позже.
Короче говоря, это выражение исключает все записи, в которых день рождения наступает между 1 января и текущей датой.
Совет: Дополнительные примеры выражений условий запроса см. в статье Примеры условий запроса.
-
-
На вкладке Конструктор в группе Настройка запросов введите 3 в поле Возвращаемый результат .
-
На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить
.
Примечание: В собственном запросе с использованием собственных данных иногда может отображаться больше записей, чем указано. Если данные содержат несколько записей с общим значением, которое входит в число основных значений, запрос вернет все эти записи, даже если это означает, что вы получите больше записей, чем вы хотели.
Поиск самых или последних дат для групп записей
Запрос итогов используется для поиска самых ранних или последних дат записей, которые попадают в группы, например события, сгруппированные по городам. Запрос итогов — это запрос на выборку, который использует агрегатные функции (такие как Group By, Min, Max, Count, First и Last) для вычисления значений для каждого поля вывода.
Добавьте поле, которое вы хотите использовать для категорий ( чтобы сгруппировать по ), и поле со значениями, которые требуется суммировать. Если вы включаете другие поля вывода, например имена клиентов при группировке по типу событий, запрос также будет использовать эти поля для создания групп, изменяя результаты, чтобы они не ответили на исходный вопрос. Чтобы пометить строки с помощью других полей, создайте дополнительный запрос, который использует запрос итогов в качестве источника, и добавьте в этот запрос дополнительные поля.
Совет: Создание запросов по шагам — это очень эффективная стратегия для ответов на более сложные вопросы. Если вам не удается получить сложный запрос для работы, подумайте, можно ли разбить его на ряд более простых запросов.
Создание итогового запроса
В этой процедуре для ответов на этот вопрос используется таблица примеров событий и таблица EventType :
Когда было последнее событие каждого типа, за исключением концертов?
-
На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
-
Дважды щелкните таблицы События и EventType. Каждая таблица отображается в верхнем разделе конструктора запросов.
-
Дважды щелкните поле EventType таблицы EventType и Поле EventDate из таблицы События, чтобы добавить поля в сетку конструктора запросов.
-
В сетке конструктора запроса в строке Условия поля EventType введите <>Concert.
Совет: Дополнительные примеры выражений условий см. в статье Примеры условий запроса.
-
На вкладке Конструктор в группе Показать или скрыть нажмите кнопку Итоги.
-
В сетке конструктора запроса щелкните строку Всего в поле EventDate и нажмите кнопку Макс.
-
На вкладке Конструктор в группе Результаты выберите команду Режим, а затем — пункт SQL.
-
В окне SQL в конце предложения SELECT сразу после ключевое слово AS замените MaxOfEventDateна MostRecent.
-
Сохраните запрос как MostRecentEventByType.
Создание второго запроса для отображения более подробных данных
Эта процедура использует запрос MostRecentEventByType из предыдущей процедуры, чтобы ответить на этот вопрос:
Кто был клиентом на последнем событии каждого типа?
-
На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
-
На вкладке Запросы дважды щелкните запрос MostRecentEventByType.
-
На вкладке Таблицы дважды щелкните таблицы События и Клиенты.
-
В конструкторе запросов дважды щелкните следующие поля:
-
В таблице События дважды щелкните EventType.
-
В запросе MostRecentEventByType дважды щелкните Элемент MostRecent.
-
В таблице Клиенты дважды щелкните Пункт Компания.
-
-
В сетке конструктора запроса в строке Сортировка столбца EventType выберите По возрастанию.
-
На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.