Полная версия этой страницы:
Запрос на разницу. Access
Помогите пожалуйста.
Существует две таблицы с полями: у 1-ой - [ИД Лицевого счета];[Лицевой счет]; у 2-ой [ИД показания];[ИД Лицевого счета];[Дата снятия показания];[Показание]. Отношение один-ко-многим.
Как создать Запрос вычисляющий разницу показаний последнего и предыдущего для каждого Лицевого счета?
Просьба ответить поподробнее. Заранее спасибо
Одним запросом никак. Понадобятся как минимум три:
1. Вычисление первого показания.
2. Вычисление последнего показания.
3. Объединение результатов
1. SELECT [ИД Лицевого счета], First([Показание]) As FIRST_VAL FROM таблица2 GROUP BY [ИД Лицевого счета] ORDER BY [Дата снятия показания]
2. SELECT [ИД Лицевого счета], Last([Показание]) As LAST_VAL FROM таблица2 GROUP BY [ИД Лицевого счета] ORDER BY [Дата снятия показания]
3. Первые два должны быть хранимыми, надеюсь, догадаетесь как обехдинить результыты.
Однако, подобные вещи гораздо лучше вычислять програмно в промежуточную таблицу. Т.к. гораздо проще ограничить набор лицевых счетов и надежней.
BOPOHA Наверное для получения First и Last два запроса ненадо делать.
Но автору надо не First, а предыдущий т.е. перед последним, а он может быть и не First, да и не Last.
Спасибо за ответ. Однако дело в том, что функция First мне неподходит: в поле [Показание] может быть огромное количество значений для каждого лицевого счета, а функция выберет только последнее и первое значение, вместо последнего и предпоследнего.
Существуют ли другие способы?
Уважаемые программисты. Можете ли Вы помочь с решением данной задачи?
Raven
А если предыдущего нет, то как тогда?
Упс... действительно с first ошибся.
Программно эта задача решается на ура.
Тогда пожалуйста подскажи, как эта задача решается программно.
Код
Dim rst As DAO.Recordset
Dim rstSub As DAO.Recordset
Dim dtLast As Date
Dim dtPrev As Date
Set rst = CurrentDb.OpenRecordset("SELECT [ИД Лицевого счета] as Id FROM таблица1", dbOpenForwardOnly)
Do While Not rst.EOF
Set rstSub = CurrentDb.OpenRecordset("SELECT [Показание] as Pokazanie FROM таблица2 WHERE [ИД Лицевого счета] = " & Nz(rst("Id"), 0), dbOpenSnapshot)
If Not rstSub.EOF Then
'-- последняя дата
rstSub.MoveLast
dtLast = rstSub("Показание")
'-- предпоследняя дата
rstSub.MovePrevious
If Not rstSub.BOF Then
dtPrev = rstSub("Показание")
Else
dtPrev = ????? '-- значение по умолчанию
End If
'-- делаем что-нибудь с полученными датами
End If
rstSub.Close
rst.MoveNext
Loop
rst.Close
С тебя шеколадка :-).
P.S. Код не тестировался - возможны ошибки.
Я еще не пробовал, но мне кажеться что функция LAST тут не пойдет, поскольку максимальная дата у меня может быть и не с последним ИД. Эта программа будет работать если функцию LAST заменить на MAX?
извини за назойливость, но я всего месяц в Access работаю. Допустим нашел я последнюю дату и предпоследнюю, теперь мне надо соотнести с этими датами показания и найти между ними разницу- последнее показание и предпоследнее. Как это сделать? С меня магарыч.
Ах... совсем забыл. В запросе нужно действительно отсортировать по дате
ORDER BY поле в помощь.
Т.е. так "SELECT [Показание] as Pokazanie FROM таблица2 WHERE [ИД Лицевого счета] = " & Nz(rst("Id"), 0) & " ORDER BY [Дата снятия показания]"
В кодя я не много нахамутал.
Вместо
Код
Dim dtLast As Date
Dim dtPrev As Date
стоит использовать
Код
Dim lLast As Long
Dim lPrev As Long
Подразумевается что поле Показание длинное целое.
Соответственно: lLast = rstSub("Показание") и lPrev = rstSub("Показание")
Вот два поаказания. Можно разницу считать. И т.д.
eskandernostra
19:04:2008, 17:02
Можете сказать как сделать запросы в access, которые могли бы вывести координаты тех заводов, которые провели замеры параметров печи, газовый анализ и анализ химии сырья в один день и подсчитать разницу между динамическим и статическим давлением в печи. Меня собственно интересует сам механизм. Заранее спасибо.
Ну что вас сказать. Открыли бы новую тему. Какой механизм вам рассказывать я не представляю. Не все задачи делаются запросами, иногда проще посчитать данные программно во временную таблицу. Если хотите получить ответ, то просто скажите какие таблицы и поля есть, какие данные необходимо получить.
eskandernostra
22:04:2008, 11:42
Спасибо уже справился, было не сложно. Но вот у меня новый вопрос. Как с помощью циклов For… Next и Do While…Loop написать с помощью VBA в excel программу для кнопки, которая бы смогла вычислить значения уравнения и вывести эти значения в массив, причем значения для x взяты из другого массива. Конечно мой вопрос не относится к access, но я думаю вы сможете помочь.
Собственно говоря, для нового вопроса, новая тема.
Вопрос излишне абстрактен. Где масивы? Какая формула? Уточняется в новой теме.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.