0

次のフィールドで在庫の変化を追跡するテーブルがあります。

InvNo int
InStock int
AdjustedOn datetime

最新の InStock 値が、指定された InvNo の最後の InStock 値よりも少なくとも 10 大きい/小さい個別の InvNo 値を返すクエリを作成しようとしています。

また、同じことを行うために同様のクエリを作成しようとしていますが、InvNo の場合、InStock 値は前の値よりも 10 大きい/小さいです。

私は以前にこれをやったことがあり、それほど複雑ではないことはわかっていますが、今朝の賢明な時間内にそれを行う方法を思い出すのに少し苦労しました.

編集: テーブルに Id フィールドはありませんが、クエリが簡単になる場合は追加できます。

4

2 に答える 2

1

最新の行と現在の行の両方をSQLクエリに含めるには、自己結合を行う必要があります...

Select c.InvNo, c.inStock current, r.InStock Previous
From table c join table r 
    on r.invNo = c.invNo
       And r.AdjustedOn =
         (Select Max(AdjustedOn)
          From table 
          Where invNo = c.InvNo
            And adjustedOn < c.AdjustedOn)
Where c.InStock >= r.Instock + 10 Or
      c.Instock <= r.Instock - 10

これにより、その時点での変更が前回の変更から 10 以上あったすべての行が得られますが、最新の変更より前に過去に発生した変更が含まれます。クエリに最新の変更を表す行のみを含める場合は、別の述語サブクエリを外側の SQL に追加します...

Select c.InvNo, c.inStock current, r.InStock Previous
From table c join table r 
    on r.invNo = c.invNo
       And r.AdjustedOn =
         (Select Max(AdjustedOn)
          From table 
          Where invNo = c.InvNo
            And adjustedOn < c.AdjustedOn)
Where (c.InStock >= r.Instock + 10 Or
       c.Instock <= r.Instock - 10)
  And c.AdjustedOn =
    (Select Max(AdjustedOn)
     From table 
     Where invNo = c.InvNo)
于 2013-09-26T15:34:18.400 に答える