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가 더 효율적일 수 있다고 생각했습니다. 필자는 쿼리 유형에 따라 계층 구조에 대한 재귀 적 CTE를 성공적으로 수행 했으므로이 다른 방식으로 달성 할 수있는 쿼리를 성공적으로 마무리 할 수 없었습니다.
어떤 도움이나 간단한 방법으로 감사하겠습니다.
흠, 당신은 일반적으로 윈도우/OLAP 함수 ('LAG() '를 사용한다고 생각할지라도, 재귀 적으로 그렇게 할 수 있어야한다. 주로 스택 오버플로 유형의 예외에 대해 걱정할 것입니다. 또한,'SET @OnHandQty = 0'은 나를 '틀린'것으로 생각합니다. 실제로 컴퓨터가 알고있는 것 이상을 가지고 있다면 어떻게 될까요? 최소한 일시적으로 네거티브를 허용해야합니다. 그리고 그 중첩 된 'IF'는 불필요합니다. 그래도 나는 이것이 정상적으로 끝날 수 있다고 생각합니다 ... 어떤 경우이든 커서가 필요 없습니다. –
나는 OnHand가 더 많은 경우 부정적인 케이스가 나중에 처리 될 것이고 원래의 개발자와 이야기를 할 수 없습니다. OnHand를 더 많이받은 경우 이미 해당 제품을 발송했다는 의미입니다. 조금 혼란스러워. OnHand = 0이 총 비용에 더 많은 것을 더하는 것을 막을 수 있도록 실제로는 실제로 거기에 중단이 없었습니다. 나는 더 나은 방법이 있어야한다고 생각합니다. – Cericme
재귀 솔루션이 성능을 향상시켜야합니까? – danihp