我在SQL 2005中,我試圖將此遊標轉換爲不是遊標的東西,以確定這是否是最有效的方法。SQL中的庫存價格計算
--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可能更有效率。我只成功完成了任何針對Heirarchy的Recursive CTE,其中包括以下類型的查詢,並且我還沒有能夠成功地將我的頭部包裹在一個可以以另一種方式實現的查詢中。
任何幫助或一個簡單的多數民衆贊成如何必須將不勝感激。
嗯,你應該能夠遞歸做到這一點,但我覺得你通常會使用一個窗口/ OLAP功能('LAG()',我想,但我不認爲2005年有它)。我主要擔心堆棧溢出類型的異常。另外,SET @OnHandQty = 0讓我覺得「錯誤」 - 如果你的身體比計算機知道的多,會發生什麼?你應該至少暫時允許手頭的負面信息。而且嵌套的「IF」應該是不必要的。雖然,我認爲這可以照常進行......無論如何,你都不需要光標。 – 2012-07-13 20:03:46
我繼承這一點,不能跟原來的開發商,早已不復存在,負案實際上是處理了一下後,如果我們有更多的現有量那麼我們收到對其採取在另一個地方的責任。如果我們有更多的接收,然後OnHand,這意味着我們已經將該產品運出。有點混亂。它實際上並沒有在那裏休息,所以OnHand = 0阻止它增加更多的總成本。我只是覺得應該有更好的方法。 – Cericme 2012-07-13 20:29:06
您確定遞歸解決方案應該可以提高性能嗎? – danihp 2012-07-13 20:57:02