0

在庫トランザクションのテーブルがあります。調整後の数量が現在の在庫量よりも大きくなるまで、最近のいくつかのトランザクションの日付を選択する必要があります。

私は 3 つの列を扱っていますitem, transaction_date, adj_qty。各アイテムには、複数の取引日と調整数量があります。

アイテムが特定のしきい値に達するまで (つまり、100 を累積するまで)、各アイテムのすべての transaction_dates を返すにはどうすればよいですか。最初のアイテムに 2000 のトランザクションがあり、最後の 5 つのトランザクションの数量がそれぞれ 21 であるとします。アイテムが 100 に達したときであるため、最後の 5 つのトランザクションを返すクエリが必要です。

可能であれば、ループやカーソルなしでこれを行いたいです。

誰でも助けることができますか?

4

1 に答える 1

2

必要なのは累計です。これは、SQL Server 2012 に組み込まれています。

残念ながら、自己結合でそれを行う必要があります。

select t.item, t.transaction_date, t.adj_qty, 
       sum(tprev.adj_qty) as CumSum
from t t join
     t tprev
     on t.item = tprev.item and
        t.transaction_date >= tprev.transaction_date
group by t.item, t.transaction_date, t.adj_qty
having 100 between sum(tprev.adj_qty) -t.adj_qty + 1 and sum(tprev.adj_qty)

self join と group by を使用して累積合計を計算していることに注意してください。快適ではありませんが、SUM() over (partition by) 関数の order 句がなければ必要です。この累積合計は、アイテムの最初のレコード (取引日別) からその他のレコードまでのすべてを合計します。

HAVING 句は、探している行を選択します。ここでは、累積合計が一定のしきい値を超えて増加しています。

于 2012-05-23T18:44:43.927 に答える