Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запрос на разницу. Access
Форум программистов > Базы данных и администрирование > Остальные БД
Raven
Помогите пожалуйста.
Существует две таблицы с полями: у 1-ой - [ИД Лицевого счета];[Лицевой счет]; у 2-ой [ИД показания];[ИД Лицевого счета];[Дата снятия показания];[Показание]. Отношение один-ко-многим.
Как создать Запрос вычисляющий разницу показаний последнего и предыдущего для каждого Лицевого счета?
Просьба ответить поподробнее. Заранее спасибо
BOPOHA
Одним запросом никак. Понадобятся как минимум три:
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. Первые два должны быть хранимыми, надеюсь, догадаетесь как обехдинить результыты.

Однако, подобные вещи гораздо лучше вычислять програмно в промежуточную таблицу. Т.к. гораздо проще ограничить набор лицевых счетов и надежней.
sax_ol
BOPOHA
Наверное для получения First и Last два запроса ненадо делать.
Но автору надо не First, а предыдущий т.е. перед последним, а он может быть и не First, да и не Last. smile.gif
Raven
Спасибо за ответ. Однако дело в том, что функция First мне неподходит: в поле [Показание] может быть огромное количество значений для каждого лицевого счета, а функция выберет только последнее и первое значение, вместо последнего и предпоследнего.
Существуют ли другие способы?
Raven
Уважаемые программисты. Можете ли Вы помочь с решением данной задачи?
sax_ol
Raven
А если предыдущего нет, то как тогда?
Raven
Тогда равно 0.
BOPOHA
Упс... действительно с first ошибся.

Программно эта задача решается на ура.
Raven
Тогда пожалуйста подскажи, как эта задача решается программно.
BOPOHA
Код
    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. Код не тестировался - возможны ошибки.
Raven
Я еще не пробовал, но мне кажеться что функция LAST тут не пойдет, поскольку максимальная дата у меня может быть и не с последним ИД. Эта программа будет работать если функцию LAST заменить на MAX?

извини за назойливость, но я всего месяц в Access работаю. Допустим нашел я последнюю дату и предпоследнюю, теперь мне надо соотнести с этими датами показания и найти между ними разницу- последнее показание и предпоследнее. Как это сделать? С меня магарыч.
BOPOHA
Ах... совсем забыл. В запросе нужно действительно отсортировать по дате 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
Можете сказать как сделать запросы в access, которые могли бы вывести координаты тех заводов, которые провели замеры параметров печи, газовый анализ и анализ химии сырья в один день и подсчитать разницу между динамическим и статическим давлением в печи. Меня собственно интересует сам механизм. Заранее спасибо.
BOPOHA
Ну что вас сказать. Открыли бы новую тему. Какой механизм вам рассказывать я не представляю. Не все задачи делаются запросами, иногда проще посчитать данные программно во временную таблицу. Если хотите получить ответ, то просто скажите какие таблицы и поля есть, какие данные необходимо получить.
eskandernostra
Спасибо уже справился, было не сложно. Но вот у меня новый вопрос. Как с помощью циклов For… Next и Do While…Loop написать с помощью VBA в excel программу для кнопки, которая бы смогла вычислить значения уравнения и вывести эти значения в массив, причем значения для x взяты из другого массива. Конечно мой вопрос не относится к access, но я думаю вы сможете помочь.
BOPOHA
Собственно говоря, для нового вопроса, новая тема.
Вопрос излишне абстрактен. Где масивы? Какая формула? Уточняется в новой теме.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2008 IPS, Inc.