在庫の現在の価値を計算する SQL クエリ (SQL Server 2005) を作成しようとしています。次のようなテーブルがあります。
ID | QTY | BasePrice
1 | 10 | 100
2 | -2 | 0
3 | -2 | 0
4 | 10 | 200
5 | -2 | 0
qty > 0 は入庫、< 0 は出庫です。他のビジネス ルールにより、マイナスの数量は BasePrice を記録しません。基本価格はユニットあたりの価格です。
まだ手元にある在庫の平均価格または合計価格のいずれかを見つける必要があります。したがって、結果の列は次のようになる必要があります。
ID | QTY | BasePrice | TotalPrice | AveragePrice
1 | 10 | 100 | 1000 | 100
2 | -2 | 0 | 800 | 100
3 | -2 | 0 | 600 | 100
4 | 10 | 200 | 2600 | 162.50
5 | -2 | 0 | 2275 | 162.50
私はこれを解決することができました:
select g1.projectionID,
g1.qty,
g1.basePrice,
((sum(isnull(g2.basePrice,0)))) * sum(isnull(g2.Qty,0)) + (g1.Qty * (case when g1.Qty < 0 THEN (sum(isnull(g2.basePrice,0))) ELSE g1.BasePrice END)) As CurrenctValueOfStockOnHand
from test g1
left join test g2 on g2.projectionID < g1.projectionID
group by g1.ProjectionID, g1.Qty, g1.BasePrice
これにより、次のことが得られます。
ID| QTY| BasePrice | TotalPrice
1 | 10 | 100.0000 | 1000.0000
2 | -2 | 0.0000 | 800.0000
3 | -2 | 0.0000 | 600.0000
4 | 10 | 200.0000 | 2600.0000
5 | -2 | 0.0000 | 4200.0000
しかし、ご覧のとおり、在庫の 2 番目のロットが追加された後 (ID 4 の後) に間違った値が返されます。
現在、各レコードをループして現在の合計を保持する C# コードがあります。大型株の場合、これには非常に時間がかかります。唯一のオプションがカーソルを使用することである場合は、C# コードを保持します。