Вычислить разницу между строками в Access

Таблица выглядит так:

part  value   
BAC    102  
BS1    275  
MAV    425  
BAC    519  
BSF    653  
BAC   1072

Результат будет:

По части БАК

part  value  difference   
BAC    102       102  
BAC    519       417  
BAC   1072       553 

Нет никаких отношений, кроме значения в порядке.

Был использован следующий оператор SQL, но результат бесполезен, потому что результат не фильтруется по частям, как спрашивает «ГДЕ», а первая строка должна иметь значение разницы 102, но она пуста.

 SELECT ABS(T2.value - T1.value) AS Difference, T1.Part,T1.value,  
 FROM table AS T1 RIGHT JOIN table AS T2 ON 
 T2.report = T1.Report+ 1
 WHERE (((T1.part)=[Forms]![Parts]![Part]));

ОБНОВИТЬ:

Я добавил в функцию @Tom Collins

Function GetDiff(CurrPart As String, CurrValue As Long) As Long  
Static LastPart As String  
Static LastValue As Long  
   If CurrPart <> LastPart Then  
      LastValue = 0  
      LastPart = CurrPart  
   End If  
   If LastValue = CurrValue Then  
   GetDiff = CurrValue  
   Else  
   GetDiff = CurrValue - LastValue  
   LastValue = CurrValue  
   End If  
End Function  

Выводы:
Выходит, что функция работает нормально, но происходит странная вещь, когда результаты помещаются в отчет, первое значение запроса получается неверным, а при клике - правильным. Еще одна странная вещь: если я хочу, чтобы среднее значение для поля отображалось с неправильным значением, оно отображает правильное среднее значение, и если я нажимаю на неправильное значение, которое становится правильным, среднее значение остается прежним. На вопрос был дан ответ, и оставшаяся проблема - это другой вопрос. Спасибо @ Том Коллинз.


person Catalin FRANCU    schedule 09.06.2013    source источник
comment
Откуда берутся 417 и 553 и что вы пытались сделать, с какой частью синтаксиса SQL у вас возникли проблемы?   -  person mmmmmm    schedule 10.06.2013
comment
Разница 519-102 и 1072-519. Проблема в том, что первая строка не дает мне числа 102. Она пуста.   -  person Catalin FRANCU    schedule 10.06.2013


Ответы (1)


ОК, новый ответ на прямой SQL.

SELECT parts.id,
       parts.part,
       parts.value1,
       [value1] - Nz(Dmax("value1", "parts", "(value1 <" & [value1] &
                                             ") and (part = '" & [part]
                                                        &
                                                           "')"), 0) AS Diff
FROM   parts; 

Функция DMax возвращает предыдущее значение (наибольшее значение, которое меньше текущего значения, и где часть такая же), а Nz Функция возвращает 0, если нет предыдущего значения.

person Tom Collins    schedule 10.06.2013
comment
Спасибо за ваш ответ. он делает то, что должен, за одним исключением. Ячейка разницы, где должно быть 102, - это разница между 102-1072 (-970), что неверно. - person Catalin FRANCU; 10.06.2013
comment
На самом деле происходит что-то странное. Для первого запуска функции результаты хорошие, но второй запуск функции имеет поведение, представленное ранее. - person Catalin FRANCU; 10.06.2013
comment
Я добавил предложение WHERE WHERE (((Parts.Part)=[Forms]![Parts]![Part])) и оно дает мне в первый раз правильное значение, а в любое другое время -970 - person Catalin FRANCU; 11.06.2013
comment
Да, на самом деле данные отправляются в отчет, и если пользователь обновляет отчет, он меняет результат. - person Catalin FRANCU; 11.06.2013
comment
Это работает, но у меня проблема с получением значений в отчете. Он отображает неправильное значение для первого значения, как мы уже говорили, но если я получу среднее значение для трех значений, все будет в порядке. Первое среднее значение равно 102, а не -970. Так почему же он показывает неправильное значение, если использует правильное? - person Catalin FRANCU; 11.06.2013
comment
Да, я использовал другую фиктивную переменную и понимаю работу функции, но опять же, я думаю, что это не вопрос запроса, а что-то происходит на стороне отчета. Также в отчете, если я нажимаю на неправильное значение, оно превращается в правильное значение, но только при однократном нажатии на это значение, если я нажимаю на другие значения, все превращается в мусор. - person Catalin FRANCU; 11.06.2013
comment
Если я использую оператор Select в запросе, результаты будут в порядке. Если я использую оператор в источнике управления отчета, результаты не будут хорошими. То же самое, если я использую запрос в источнике управления. - person Catalin FRANCU; 11.06.2013
comment
Хорошо, нашел лучшее решение. Это прямой SQL и не использует VBA. Я думаю, вам понравится. Я также удалил свои предыдущие комментарии, поскольку они ссылались на мой предыдущий ответ, чтобы не смущать других, которые могут прочитать это позже. - person Tom Collins; 11.06.2013