Вычисления в таблицах Visual FoxPro
« Назад Вычисления производятся командами AVERAGE, CALCULATE, COUNT и SUM. Для всех перечисленных команд справедливо следующее: 1. Результаты отображаются на экране, если SET TALK установлен в ON. Если SET HEADINGS установлен в ON, то выводятся и вычисляемые выражения, размещаемые над результатами. 2. Записи, имеющие пометку удаления, обрабатываются, если SET DELETED установлен в OFF, и не обрабатываются – в противном случае. Команды приводятся в алфавитном порядке. Их опции и параметры описаны в табл. 1.7 и 3.13. Таблица 3.13
Опции и параметры команд, выполняющих вычисления в таблицах
Команда AVERAGE [eExpressionList] [Scope] [FOR lExpression1]
|
Price |
BookId**2 |
194.58 |
54.17 |
Пример 2. Вычисляется средняя цена книг, код которых больше среднего значения кода.
&& Находим среднее значение кода книг
average BookId to avgBookId
average Price for BookId > avgBookId to avgPrice
Пример 3. Вычисляется средняя цена книг (поле Price таблицы Books ) авторов, введенных в базу после 1 января 2004 г (поле InputDate таблицы Authors).
close databases
open database D:\HomeLibrary\HomeLibrary.dbc
store {^2004–01–01} to someDate
&&
&& Выбираем необходимые для вычислений данные в таблицу BookPrice
&& Для этой цели нужно привлечь 3 таблицы: Authors, Books и BooksAuthors
select Price;
from Books, Authors, BooksAuthors;
where Books.BookId = BooksAuthors.BookId;
and Authors.AuthorId = BooksAuthors.AuthorId;
and Authors.InputDate > someDate;
into cursor BookPrice
&& После выполнения SELECT выбрана область, в которой открыт курсор BookPrice
&&
&& Получаем и печатаем результат
average Price to avgPrice
? avgPrice
Команда
CALCULATE eExpressionList [Scope] [FOR lExpression1]
[WHILE lExpression2] [TO VarList | TO ARRAY ArrayName]
[NOOPTIMIZE] [IN nWorkArea | cTableAlias]
выполняет финансовые и статистические операции с полями таблиц или с выражениями, включающими поля, используя в качестве элементов eExpressionList приведенные в табл. 3.14 функции.
Таблица 3.14
Функции, употребляемые в eExpressionList команды CALCULATE
Функция |
Описание |
AVG(nExpression) |
Вычисляет среднее арифметическое всех значений nExpression |
CNT( ) |
Возвращает число записей, удовлетворяющих условиям, заданным Scope FOR и WHILE |
MAX(eExpression) |
Возвращает максимальное из всех значений eExpression. Тип eExpression может быть Character, Date, DateTime, Currency и любой числовой |
MIN(eExpression) |
Возвращает минимальное из всех значений eExpression. Тип eExpression может быть Character, Date, DateTime, Currency и любой числовой |
NPV(nExpression1, |
Вычисляет величину чистой приведенной стоимости инвестиции, используя ставку дисконтирования nExpression1, а также стоимости (nExpression2) будущих выплат (отрицательные значения) и поступлений (положительные значения). |
STD(nExpression) |
Вычисляет стандартное (среднее квадратичное) отклонение величин, возвращаемых nExpression.
|
SUM(nExpression) |
Возвращает сумму всех значений выражения nExpression |
VAR(nExpression) |
Вычисляет дисперсию D величин, возвращаемых nExpression. Она равна квадрату стандартного отклонения: |
Замечание. Помимо перечисленных в таблице функций, выражения eExpressionList могут содержать и иные функции. Однако функции таблицы не могут быть аргументами иных функций. Так, можно записать команду
calculate Avg(Sqrt(Price))
однако следующая команда недопустима
calculate Sqrt(Avg(Price))
В результатах, возвращаемых функциями, учитываются только записи, удовлетворяющие условиям, заданным Scope, FOR и WHILE. Поля, содержащие NULL, при вычислениях CALCULATE не учитываются.
Пример. Вычисляются средняя и максимальная цены книг, а также стандартное отклонение цен по данным, имеющимся в таблице Books. Результаты сохраняются в массиве calcResults. В последний элемент массива заносится количество вовлеченных в вычисления записей.
set talk off
select Books
&& Записываем результаты в массив calcResults
calculate Avg(Price), Max(Price), Std(Price) , Cnt( ) to array calcResults
&& Печать результата
display memory like calcResults
Возможный результат:
calcResults
( 1) N 195.71 (195.71428571)
( 2) N 210.00 (210.00000000)
( 3) N 10.33 ( 10.32630878)
( 4) N 14 ( 14.00000000)
Команда
COUNT [Scope] [FOR lExpression1] [WHILE lExpression2]
[TO VarName] [NOOPTIMIZE]
вычисляет число записей, удовлетворяющих заданным условиям.
Замечание. Такие же результаты при прочих равных условиях возвращает команда CALCULATE, употребленная с функцией CNT( ).
Команда
SUM eExpressionList [Scope] [FOR lExpression1]
[WHILE lExpression2] [TO VarName | TO ARRAY ArrayName]
[NOOPTIMIZE]
вычисляет суммы значений, возвращаемых выражениями, входящими в eExpressionList. Число сумм равно числу имеющихся в eExpressionList выражений.
В вычисления включаются все числовые поля таблицы, если параметр ExpressionList опущен.
Замечание. Такие же результаты при прочих равных условиях возвращает команда CALCULATE, употребленная с функцией SUM( ).
Команда
TOTAL TO TableName ON FieldName [FIELDS FieldNameList] [Scope]
[FOR lExpression1] [WHILE lExpression2] [NOOPTIMIZE]
вычисляет суммы числовых полей (итоги) текущей таблицы по полю (выражению) FieldName, записывая результат в таблицу TableName.
Если таблица не существует, то она будет создана, если существует, то перезаписана. Диалог, предупреждающий о существовании таблицы и предоставляющий возможность отказаться от ее перезаписи, появляется, если SET SAFETY установлен в ON.
Опции и параметры (см. также табл. 1.7 и 3.13):
ON FieldName – задает поле или выражение с полями таблицы, по которому группируются итоги. Таблица должна либо быть отсортирована по этому выражению, либо активный индекс должен быть иметь его в качестве ключевого выражения.
FIELDS FieldNameList – список полей, по которым подводятся итоги. Имена полей в списке разделяются запятыми. Если опция опущена, то итоги подводятся по всем полям.
Число записей в результирующей таблице равно числу несовпадающих значений в поле FieldName (с учетом Scope- FOR- и WHILE-ограничений). Отдельные итоги вычисляются для группы записей с одинаковым значением поля FieldName.
Если размер поля в результирующей таблице недостаточен для хранения итога, то VFP выполняет следующие действия:
-
отсекаются позиции с данными после десятичной точки, оставшаяся порция данных после десятичной точки (если отсечены не все позиции) округляется;
-
если итог по-прежнему не помещается в поле, то для его отображения используется научная нотация (экспоненциальная форма), при условии, что размер поля не менее 7;
- если научная нотация не может быть применена, то выводятся звездочки.
Пример. Таблица Test.dbf содержит приведенные в табл. 3.15 данные.
Таблица 3.15
Данные таблицы Test.dbf
TestDate |
TestFloat |
TestCrncy |
01/01/04 |
1.300 |
600.0000 |
01/01/04 |
2.400 |
600.0000 |
01/01/04 |
3.500 |
600.0000 |
11/16/04 |
1.400 |
100.0000 |
11/16/04 |
2.500 |
200.0000 |
11/16/04 |
3.600 |
300.0000 |
12/27/04 |
1.200 |
400.0000 |
12/27/04 |
2.300 |
500.0000 |
12/27/04 |
3.400 |
500.0000 |
12/27/04 |
4.500 |
500.0000 |
select Test
&& Создаем индекс с ключевым выражением DTOS(TestDate)
index on Dtos(TestDate) to d:\TestDate
&& Вычисляем итоги по полю TestDate
total to d:\TableOfTotals on TestDate fields TestDate, TestFloat, TestCrncy
&& Просмотр результатов
use d:\TableOfTotals in 0
select TableOfTotals
browse fields TestDate, TestFloat, TestCrncy
Данные таблицы с итогами приведены в табл. 3.16.
Таблица 3.16
Таблица TableOfTotals: итоги по полю TestDate
TestDate |
TestFloat |
TestCrncy |
01/01/04 |
7.200 |
1800.0000 |
11/16/04 |
7.500 |
600.0000 |
12/27/04 |
11.400 |
1900.0000 |
Замечание. Тот же результат получается, если на месте FieldName употребить DTOS(TestDate).
total to d:\tableOfTotals on Dtos(TestDate) fields TestDate, TestFloat, TestCrncy
Также успешно на месте FieldName могут быть употреблены и более сложные ключевые выражения, например:
select Test
&& Создаем индекс с ключевым выражением
&& DTOS(TestDate) + TRANSFORM(TestInt),
&& в котором TestDate и TestInt – поля таблицы Test.dbf
index on Dtos(TestDate) + Transform(TestInt) to d:\TestDate
&& Вычисляем итоги по ключевому выражению
total to d:\TableOfTotals on Dtos(TestDate) + Transform(TestInt)
fields TestDate, TestFloat, TestCrncy