Как сделать подсчет в access
Все специалисты Access хранят в своих БД несколько (или несколько десятков) полезных запросов, упрощающих решение повседневных задач. В предыдущей главе вы узнали, как создавать запросы, обрабатывающие огромные объемы информации и предлагающие вам именно то, что вы хотите увидеть. Но знатоки программы Access знают, что гораздо больше мощи прячется за пределами окна конструктора запросов.
В этой главе вы проникните в магические тайны создания запросов, которые, конечно же, произведут впечатление на вашего шефа, коллег и партнеров. Вы узнаете, как выполнять вычисления в запросе и подводить итоги, сжимающие колонки цифр до лаконичных итоговых сумм. Вы также научитесь писать сверхинтеллектуальные условия отбора и создавать динамические запросы, запрашивающие информацию при каждом выполнении. Эти методы — неотъемлемая часть набора рабочих средств любого настоящего фанатика запросов.
Вычисляемые поля
Когда вы начинали проектировать таблицы, то узнали, что в мире БД считается преступлением включение информации, основанной на данных другого поля или другой таблицы. Примером такой ошибки может служить таблица Products, в которой есть и поле Price (цена), и поле PriceWithTax (цена с включенным налогом). Проблема в том, что поле PriceWithTax вычисляется на основании поля Price. Хранение обоих полей — это избыточное расходование дискового пространства. Еще хуже, если налоговая ставка изменится, тогда вы останетесь с множеством записей, нуждающихся в обновлении, и возможностью появления противоречивых данных (например, когда цена с налогом окажется ниже цены без налога).
Даже зная, что не следует создавать поля, такие как PriceWithTax, иногда вы вынуждены отображать в программе Access вычисляемые данные. Прежде чем компания Boutique Fudge напечатает список для одного из своих наименее любимых розничных продавцов, она хочет установить для цены надбавку 10%. Для этого компании необходимо откорректировать информацию о цене до вывода данных на печать. Если продавец увидит более низкую цену без надбавки, компания будет вынуждена запросить ее.
Запросы предлагают отличное решение такого рода проблем, поскольку они содержат универсальные методы математической обработки данных. Хитрость состоит в добавлении вычисляемого поля: поля, определенного в вашем запросе, но не существующего в таблице. Программа Access вычисляет значение этого поля, основываясь на одном или нескольких других полях таблицы. Значения вычисляемых полей никогда не хранятся в БД — программа генерирует их при каждом выполнении запроса.
Определение вычисляемого поля
Для создания вычисляемого поля следует задать два компонента: имя поля и выражение, определяющее вычисление, которые должна выполнить программа Access. Вычисляемые поля определяются с помощью следующего состоящего из двух частей шаблона:
ИмяВычисляемогоПоля: Выражение
Например, поле цены с налогом, PriceWithTax, определяется следующим образом:
PriceWithTax: [Price] * 1.10
По сути, это выражение сообщает программе Access о том, что нужно взять поле Price и умножить его на 1.10 (что эквивалентно повышению цены на 10%). Access повторяет это вычисление для каждой записи, входящей в результаты запроса. Для того чтобы это вычисление выполнялось, в таблице должно существовать поле Price. Но вовсе необязательно отображать отдельно это поле в окне результатов запроса.
Можно сослаться на поле Price, используя его полное имя, состоящее из имени таблицы с последующей точкой, за которой указано имя поля:
PriceWithTax: [Products].[Price] * 1.10
Пользователи предыдущих версий программы Access иногда вместо точки используют восклицательный знак (например, [Products] ! [ Price]), что равнозначно.
Для добавления вычисляемого поля PriceWithTax вам понадобится Конструктор. Сначала найдите столбец, в который вы хотите вставить вычисляемое поле. (Обычно оно добавляется и конец, в первый свободный столбец, хотя можно раздвинуть существующие столбцы и освободить для него место.) Далее в ячейке Поле введите полное определение поля (рис. 7.1).
У вычисляемых полей есть одно ограничение — поскольку информация не сохраняется в вашей таблице, вы не можете их редактировать. Если нужно изменить цену, необходимо отредактировать базовое поле Price — попытка корректировать поле PriceWithTax привела бы программу Access в полное замешательство.
Выражение в каждый конкретный момент времени обрабатывает отдельную запись. Если вы хотите объединить информацию из некоторых записей для вычисления итогов или средних значений, необходимо использовать свойства группировки, описанные в разд. "Итоговые данные" далее в этой главе.
Рис. 7.1. Этот запрос отображает два поля непосредственно из БД (ID и Name)
и вставляет вычисляемое поле PriceWithTax. Обычное поле Price, которое программа Access
применяет для вычисления поля PriceWithTax, вообще не отображается
Рис. 7.2. Результаты запроса отображают поле PriceWithTax с надбавкой 10%. Главное состоит в том, что вычисляемая информация теперь доступна постоянно, несмотря на то, что она не хранится в БД. Попробуйте проверить это с помощью карманного калькулятора
На профессиональном уровне. Синхронизация запросов
Можно опробовать интересный прием. Выполните запрос ProductsWithTax и оставьте его открытым, отображающим свои результаты. Теперь откройте таблицу Products, содержащую реальные данные, и измените цену любого продукта. Вернитесь снова в запрос Products WithTax. Изменилось значение в этом запросе?
Если вы не знаете, что произойдет, не бойтесь — PriceWithTax автоматически обновляется для отображения новой цены. Программа Access автоматически синхронизирует представления запросов с реальными данными в вашей таблице. Access отслеживает изменение записи и немедленно обновляет окно результатов запроса.
Есть лишь несколько исключений из этого правила.
• Access не отслеживает добавление новой записи после запуска запроса — для того чтобы она учитывалась в результатах вашего запроса, необходимо обновить результаты.
• Если вы изменили запись так, что она больше не должна попадать в результаты запроса, она не удаляется автоматически из окна результатов. Если в вашем запросе отображаются все продукты, стоящие больше 100 долларов, и вы уменьшили цену одного из них до 50 долларов, этот продукт останется в результирующем перечне вашего запроса (с новой ценой) до тех пор, пока вы не обновите результаты.
• Аналогично, если вы изменили запись так, что она должна попасть в результирующий набор, она не появится в нем, пока вы не выполните запрос еще раз.
• Если несколько пользователей на разных компьютерах редактируют БД (как описано в главе 18), вы не увидите немедленно изменения, внесенные другими пользователями.
Для получения самых свежих результатов можно обновить отдельные записи или весь запрос целиком. Для обновления одной записи выберите Главная > Записи > Обновить > Обновить запись (Home > Records > Refresh > Refresh Record). Для повторного выполнения запроса и полного обновления выберите Главная > Записи > Обновить > Обновить все (Home > Records > Refresh > Refresh All). Это действие также выводит на экран любые новые записи и скрывает те записи, которые после внесения изменений больше не удовлетворяют вашим условиям отбора.
Прежде чем двигаться дальше, есть смысл рассмотреть правила создания и использования вычисляемых полей. Далее приведено несколько рекомендаций.
¦ Всегда выбирайте уникальное имя. Выражение Price: [Price] * 1.10 создает циклическую ссылку, поскольку имя используемого вами поля такое же, как имя создаваемого поля. Программа Access не допускает подобных проделок.
¦ Формируйте выражения из полей, чисел и математических операций. Наиболее распространенные вычисляемые поля содержат одно или несколько существующих полей или числовые константы и соединяет их друг с другом с помощью хорошо знакомых знаков математических операций, таких как сложение (+), вычитание (-), умножение (*) или деление (/).
¦ Не удивляйтесь присутствию квадратных скобок. Выражение PriceWithTax: [Price] * 1.10 эквивалентно выражению PriceWithTax: Price * 1.10 (единственное отличие — квадратные скобки вокруг имени поля Price). Технически скобки нужны только,
если в имени ноля есть пробелы или специальные символы. Но если в Конструкторе вы вводите в запрос выражения без квадратных скобок, программа Access автоматически добавляет их, просто чтобы обезопасить себя.
Малоизвестная или недооцененная возможность. Переименование поля в запросе
Устали от длинных имен полей в окне результатов ваших запросов? Используя толькочто полученные знания, касающиеся выражений, можно безболезненно переименовать поле в окне результатов вашего запроса. Все что вам требуется — это вычисляемое поле. Хитрость заключается в создании (с помощью выражения) вычисляемого поля, совпадающего с одним из существующих полей и присвоении ему нового имени. Технически в этом поле не выполняются никакие вычисления, но оно все равно корректно действует. Далее приведен пример вычисляемого поля, которое переименовывает DateCustomerPlacedPurchaseOrder в Date: Date: DateCustomerPlacedPurchaseOrder Новое имя (в данном примере Date) называют псевдонимом (alias).
Используя этот прием, помните о том, что исходное иоле (в данном случае DateCustomerPlacedPurchaseOrder) не надо включать в ваш запрос. Нужная вам информация отображается в вычисляемом поле (Date).
Статистические функции используются в запросах главным образом для вычисления всевозможных итоговых значений, например для числового поля таблицы можно вычислить среднее значение или сумму значений для всех или отобранных записей, можно посчитать количество записей, возвращаемых запросом.
Статистические функции, которые можно использовать в запросах 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 (). Поэтому, если вы планируете в дальнейшем перенести свою базу данных на сервер, прежде чем использовать эти функции, нужно убедиться, поддерживаются ли они сервером. Иначе потом придется изменять все объекты, в которых встречаются эти функции.
Использование статистических функций для расчета итоговых значений тесно связано с применением групповых операций в запросе. Групповые операции позволяют задать группы, для которых выполняются вычисления. Ниже мы приведем примеры таких расчетов как на всем множестве записей, так и на подмножествах, выбранных по условиям запроса.
Функция COUNT подсчитывает количество записей в таблице.
Условие, по которому будут выбираться записи, задается с помощью команды WHERE.
Команда WHERE не является обязательной, если ее не указать - будут подсчитаны все записи в таблице.
См. также команду DISTINCT, которая позволяет подсчитывать только уникальные значения поля.
См. также команду GROUP BY, которая позволяет группировать записи и затем с помощью COUNT подсчитывать количество в группах.
Синтаксис
Подсчет всех записей:
Подсчет всех записей, где заданное поле не равно NULL:
Только уникальные значения поля:
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 400 |
2 | Петя | 25 | 500 |
3 | Вася | 23 | 500 |
4 | Коля | 30 | 1000 |
5 | Иван | 27 | 500 |
6 | Кирилл | 28 | 1000 |
Пример
Давайте подсчитаем всех работников с возрастом 23 года:
Результат выполнения SQL запроса:
count результат подсчета |
---|
2 |
Пример
Давайте подсчитаем количество разных зарплат (их будет 3 штуки: 400, 500 и 1000):
Результат выполнения SQL запроса:
count результат подсчета |
---|
3 |
Пример
Давайте подсчитаем одновременно количество разных возрастов и количество разных зарплат:
Результат выполнения SQL запроса:
count1 количество возрастов | count2 количество зарплат |
---|---|
5 | 3 |
Меняем таблицу для примеров
Все примеры ниже будут по этой таблице workers, если не сказано иное:
Microsoft Access можно использовать для самых разных расчетов. Единственным серьезным ограничением является ваше знание формул. Запросы доступа включают встроенные функции для расчета средних, итоговых и стандартных отклонений для строк данных. Для других функций в сетке запросов Access есть мастер создания выражений, который ограничивает необходимость знания языка структурированных запросов Microsoft, который используется в программном обеспечении базы данных.
Вы можете рассчитать проценты для миллионов чисел с помощью одного запроса в Microsoft Access
Шаг 1
Шаг 2
Вставьте столбцы с числами, для которых вы будете вычислять проценты в сетке запросов, либо дважды щелкнув, либо перетаскивая их из поля таблицы.
Шаг 3
Шаг 4
Шаг 5
Нажмите на красный значок с восклицательным знаком в верхней части страницы, чтобы выполнить запрос. Ваши результаты должны отображаться в десятичных числах.
Как отформатировать валюту в запросе доступа
Как изменить проценты на десятичные в Excel
Microsoft Excel упрощает сложные или повторяющиеся вычисления, позволяя создавать настраиваемые таблицы и форматировать их по мере необходимости. Потому что основная особенность Excel .
Как преобразовать число в текст в запросе доступа
Microsoft - мощная и широко используемая программа для работы с базами данных, а функция запросов - одна из самых полезных частей программы. Администраторы баз данных и обычные пользователи могут использовать .
Собственно сабж. Есть база Access, состоит из десятка таблиц. Необходимо посчитать количество всех записей. Работаю с базой через ADO. Есть идеи?
Для этого надо поочередно их открыть, или есть другой способ?
Таблицы не надо открывать. Посылаешь запрос Select count From TableName, результат которого будет количество записей в таблице. Делай так:
[highlight=delphi]
function TableRecordCount(TableName: string): integer;
begin
// Посылаешь запрос таблице TableName,
Result := // результат запроса
end;[/highlight]
А потом просто вызываешь эту функцию, в параметре которой указываешь имя таблицы, к которой выполняешь запрос.
Washington, если не тяжело, напишите правильный пример SQL-запроса и как присвоить количество записей переменной? что-то пока не пойму..
Правильный пример можно найти, если зайти в MS Access, жимануть Ф1, написать count. там всё очень подробно, с примерами.
Читайте также: