0

テーブルは次のようになります。

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  

結論:
関数は問題なく動作することがわかりましたが、結果をレポートに配置すると奇妙なことが起こり、クエリの最初の値が間違って表示され、クリックすると正しく表示されます。また、別の奇妙なことは、間違った値が表示されたフィールドの平均が必要な場合、正しい平均が表示され、間違った値をクリックしても平均が変わらないことです。質問には回答があり、残りの問題は別の質問です。ありがとう@トム・コリンズ。

4

1 に答える 1

0

OK、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を返します。

于 2013-06-10T02:19:26.070 に答える