计算Access中行之间的差异

时间:2013-06-09 23:10:51

标签: ms-access rows difference

表格如下:

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

结果将是:

部分BAC

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

除了值之外没有任何关系。

使用了以下SQL语句,但结果没用,因为结果不按部分过滤为“WHERE”要求,并且第一行应该具有差值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  

结论:
事实证明该函数可以正常工作,但是当结果放在报表中时,它会发生一个奇怪的事情,查询的第一个值出错了,当点击它时它就出现了。另外一个奇怪的事情是,如果我想要显示错误值的字段的平均值,它会显示正确的平均值,如果我点击错误的值,则转向正常,平均值保持不变。 问题已得到解答,剩下的问题是另一个问题。 谢谢@Tom Collins。

1 个答案:

答案 0 :(得分:0)

好吧,这是一个全新的答案,即海峡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。