私はSQL2005を使用しており、このカーソルをカーソルではないものに変換して、これが最も効率的な方法であるかどうかを判断しようとしています。
--Create cursor to determint total cost
DECLARE CostCursor CURSOR FAST_FORWARD
FOR SELECT ReceiptQty
,Price
FROM @temp_calculate
ORDER BY UpdateDate DESC
OPEN CostCursor
FETCH Next FROM CostCursor INTO @ReceiptQty,@Price
WHILE @@FETCH_STATUS = 0
BEGIN
IF @OnHandQty >= @ReceiptQty
BEGIN
--SELECT @ReceiptQty,@Price, 1,@OnHandQty
SET @Cost = @ReceiptQty * @Price
SET @OnHandQty = @OnHandQty - @ReceiptQty
SET @TotalCost = @TotalCost + @Cost
END
ELSE
BEGIN
IF @OnHandQty < @ReceiptQty
BEGIN
--SELECT @ReceiptQty,@Price, 2,@OnHandQty
SET @Cost = @OnHandQty * @Price
SET @OnHandQty = 0
SET @TotalCost = @TotalCost + @Cost
BREAK;
END
END
FETCH Next FROM CostCursor INTO @ReceiptQty,@Price
END
CLOSE CostCursor
DEALLOCATE CostCursor
システムは、最新の受領済み在庫と価格を調べて使用し、手持ちの支払い額を決定する必要があります。
Ex. 1st Iteration: @OnHandQty = 8 RecievedQty = 5 Price = 1 UpdateDate = 1/20 Results: @HandQty = 3 @TotalCost = $5
2nd Iteration: @OnHandQty = 3 RecievedQty = 6 Price = 2 UpdateDate = 1/10 Results: @HandQty = 0 @TotalCost = $11
最終結果は、私が手元に持っている在庫に11ドルを支払ったことを示しています。私がこれをC#または他のオブジェクト指向言語で行っていた場合、これは私に再帰を叫びます。再帰CTEの方が効率的だと思いました。私は、次のタイプのクエリに続く階層クエリの再帰CTEを正常に実行しただけであり、これを別の方法で実現するクエリに頭を悩ませることはできませんでした。
どんな助けでも、それがどうあるべきかという簡単なことをいただければ幸いです。