Запрос, нумерующий записи и выдающий сумму полей с накоплением.
Постановка задачи.
Пусть имеется таблица (запрос) MyQuery с числовым полем MyField. Другие поля также могут быть, но далее в тексте не присутствуют. MyQuery может быть отсортирован любым образом или вообще не отсортирован.
Требуется построить статический запрос, не меняющий порядка следования записей MyQuery, и добавляющий: - вычисляемое поле Num, нумерующее строки запроса, начиная с 1; - вычисляемое поле Summa, представляющее собой сумму значений поля MyField от первой строки до текущей.
Решение.
Текст запроса:
SELECT DISTINCT Numeration(MyField) as Num, SumField(MyField) As Summa, MyField FROM MyQuery WHERE Numeration() = 0 AND SumField() = 0;
Public Function SumField(Optional Var) As Double Static D As Double If IsMissing(var) Then D = 0 Else D = D + Nz(Var,0) End If SumField = D End Function
Оценка скорости исполнения.
Очевидно, что обращение к каждой строке исходного запроса производится только один раз. Поэтому оценка скорости = C*n, где C - константа, а n - число строк запроса. Качественно ускорить это решение невозможно.
Примечание.
Если в результирующем запросе все строки уникальны (например, присутствует поле "Счетчик"), то использовать нумерацию нет необходимости. Она применяется только для создания уникальных записей.
О динамических запросах, решающих аналогичную задачу.
Можно построить динамический запрос, решающий эту задачу. Однако на исходные данные придется наложить существенные ограничения. Но самое главное, такой запрос будет исполняться со скоростью = C*n*n. Избежать этого, видимо, невозможно.
Следует и здесь применить метод, изложенный в примечании к вышеупомянутой статье, который только изображает работу с динамическим запросом, реально используя статический.