Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ Остальные БД _ Запрос на разницу. Access

Автор: Raven 8:04:2008, 16:48

Помогите пожалуйста.
Существует две таблицы с полями: у 1-ой - [ИД Лицевого счета];[Лицевой счет]; у 2-ой [ИД показания];[ИД Лицевого счета];[Дата снятия показания];[Показание]. Отношение один-ко-многим.
Как создать Запрос вычисляющий разницу показаний последнего и предыдущего для каждого Лицевого счета?
Просьба ответить поподробнее. Заранее спасибо

Автор: BOPOHA 8:04:2008, 17:11

Одним запросом никак. Понадобятся как минимум три:
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 8:04:2008, 17:22

BOPOHA
Наверное для получения First и Last два запроса ненадо делать.
Но автору надо не First, а предыдущий т.е. перед последним, а он может быть и не First, да и не Last. smile.gif

Автор: Raven 8:04:2008, 17:25

Спасибо за ответ. Однако дело в том, что функция First мне неподходит: в поле [Показание] может быть огромное количество значений для каждого лицевого счета, а функция выберет только последнее и первое значение, вместо последнего и предпоследнего.
Существуют ли другие способы?

Автор: Raven 9:04:2008, 19:10

Уважаемые программисты. Можете ли Вы помочь с решением данной задачи?

Автор: sax_ol 10:04:2008, 06:02

Raven
А если предыдущего нет, то как тогда?

Автор: Raven 10:04:2008, 18:44

Тогда равно 0.

Автор: BOPOHA 10:04:2008, 20:50

Упс... действительно с first ошибся.

Программно эта задача решается на ура.

Автор: Raven 11:04:2008, 15:13

Тогда пожалуйста подскажи, как эта задача решается программно.

Автор: BOPOHA 13:04:2008, 19:04

Код
    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 14:04:2008, 14:56

Я еще не пробовал, но мне кажеться что функция LAST тут не пойдет, поскольку максимальная дата у меня может быть и не с последним ИД. Эта программа будет работать если функцию LAST заменить на MAX?

извини за назойливость, но я всего месяц в Access работаю. Допустим нашел я последнюю дату и предпоследнюю, теперь мне надо соотнести с этими датами показания и найти между ними разницу- последнее показание и предпоследнее. Как это сделать? С меня магарыч.

Автор: BOPOHA 16:04:2008, 21:00

Ах... совсем забыл. В запросе нужно действительно отсортировать по дате 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, которые могли бы вывести координаты тех заводов, которые провели замеры параметров печи, газовый анализ и анализ химии сырья в один день и подсчитать разницу между динамическим и статическим давлением в печи. Меня собственно интересует сам механизм. Заранее спасибо.

Автор: BOPOHA 21:04:2008, 06:41

Ну что вас сказать. Открыли бы новую тему. Какой механизм вам рассказывать я не представляю. Не все задачи делаются запросами, иногда проще посчитать данные программно во временную таблицу. Если хотите получить ответ, то просто скажите какие таблицы и поля есть, какие данные необходимо получить.

Автор: eskandernostra 22:04:2008, 11:42

Спасибо уже справился, было не сложно. Но вот у меня новый вопрос. Как с помощью циклов For… Next и Do While…Loop написать с помощью VBA в excel программу для кнопки, которая бы смогла вычислить значения уравнения и вывести эти значения в массив, причем значения для x взяты из другого массива. Конечно мой вопрос не относится к access, но я думаю вы сможете помочь.

Автор: BOPOHA 24:04:2008, 19:59

Собственно говоря, для нового вопроса, новая тема.
Вопрос излишне абстрактен. Где масивы? Какая формула? Уточняется в новой теме.

Русская версия Invision Power Board (http://www.nulled.ws)
© Invision Power Services (http://www.nulled.ws)