Запрос на разницу. Access

Тема в разделе "Остальные БД", создана пользователем Raven, 8 апр 2008.

  1. Raven

    Raven Гость

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

    BOPOHA Well-Known Member

    Регистрация:
    26 апр 2006
    Сообщения:
    118
    Симпатии:
    0
    Одним запросом никак. Понадобятся как минимум три:
    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. Первые два должны быть хранимыми, надеюсь, догадаетесь как обехдинить результыты.

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

    Raven Гость

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

    Raven Гость

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

    Raven Гость

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

    BOPOHA Well-Known Member

    Регистрация:
    26 апр 2006
    Сообщения:
    118
    Симпатии:
    0
    Упс... действительно с first ошибся.

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

    Raven Гость

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

    BOPOHA Well-Known Member

    Регистрация:
    26 апр 2006
    Сообщения:
    118
    Симпатии:
    0
    Код (Text):
        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. Код не тестировался - возможны ошибки.
     
  9. Raven

    Raven Гость

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

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

    BOPOHA Well-Known Member

    Регистрация:
    26 апр 2006
    Сообщения:
    118
    Симпатии:
    0
    Ах... совсем забыл. В запросе нужно действительно отсортировать по дате ORDER BY поле в помощь.

    Т.е. так "SELECT [Показание] as Pokazanie FROM таблица2 WHERE [ИД Лицевого счета] = " & Nz(rst("Id"), 0) & " ORDER BY [Дата снятия показания]"

    В кодя я не много нахамутал.
    Вместо
    Код (Text):
        Dim dtLast As Date
    Dim dtPrev As Date
    стоит использовать

    Код (Text):
        Dim lLast As Long
    Dim lPrev As Long
    Подразумевается что поле Показание длинное целое.

    Соответственно: lLast = rstSub("Показание") и lPrev = rstSub("Показание")

    Вот два поаказания. Можно разницу считать. И т.д.
     
  11. eskandernostra

    eskandernostra Гость

    Можете сказать как сделать запросы в access, которые могли бы вывести координаты тех заводов, которые провели замеры параметров печи, газовый анализ и анализ химии сырья в один день и подсчитать разницу между динамическим и статическим давлением в печи. Меня собственно интересует сам механизм. Заранее спасибо.
     
  12. BOPOHA

    BOPOHA Well-Known Member

    Регистрация:
    26 апр 2006
    Сообщения:
    118
    Симпатии:
    0
    Ну что вас сказать. Открыли бы новую тему. Какой механизм вам рассказывать я не представляю. Не все задачи делаются запросами, иногда проще посчитать данные программно во временную таблицу. Если хотите получить ответ, то просто скажите какие таблицы и поля есть, какие данные необходимо получить.
     
  13. eskandernostra

    eskandernostra Гость

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

    BOPOHA Well-Known Member

    Регистрация:
    26 апр 2006
    Сообщения:
    118
    Симпатии:
    0
    Собственно говоря, для нового вопроса, новая тема.
    Вопрос излишне абстрактен. Где масивы? Какая формула? Уточняется в новой теме.
     
Загрузка...

Поделиться этой страницей