1

请帮助解决这个问题,

我试图弄清楚如何使用 Table1 中的 QtyToSubtract 和 Product_ID 更新 Table2,每次更新 Row 时重新计算 CurrentQty 和 Balance。

对于表 1 中的每一行,我需要更新表 2 中的当前数量和余额,使用该 PRODUCT_ID 的最大余额的行从当前数量中减去。这意味着如果在减去后它仍然保持 Max BALANCE,则可以多次更新同一记录。

表 1 包含要减去的数量:

 PRODUCT_ID         QTYtoSubtract
  11111111               2
  11111111               2
  11111111               2
  22222222               6
  22222222               6 

表2需要更新

PRODUCT_ID     OriginalQTY    CurrentQty      BALANCE  = Initial+ Current           
 11111111             46              12            58
 11111111             15              40            55
 22222222              6               1             7
 22222222             24               6            28
 22222222             15               8            23 

结果应该是这样的:

 PRODUCT_ID     OriginalQTY    CurrentQty      BALANCE  = Initial+ Current           
 11111111           46              8            54
 11111111           15             38            53
 22222222            6              1             7
 22222222           24              0            22
 22222222           15              2            17 
4

1 回答 1

0

好的,这是 aCURSOR似乎是最佳选择的罕见情况之一:

DECLARE @Product_ID VARCHAR(8), @Qty INT

DECLARE CC CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR 
SELECT *
FROM Table1
ORDER BY [PRODUCT_ID], [QTYtoSubtract] DESC

OPEN CC
FETCH NEXT FROM CC INTO @Product_ID, @Qty
WHILE @@FETCH_STATUS = 0
BEGIN
    WITH CTE AS
    (
        SELECT  *,
                RN=ROW_NUMBER() OVER(ORDER BY Balance DESC)
        FROM Table2
        WHERE PRODUCT_ID = @Product_ID
    )
    UPDATE CTE
    SET BALANCE = BALANCE - @Qty
    WHERE RN = 1

    FETCH NEXT FROM CC INTO @Product_ID, @Qty
END
CLOSE CC
DEALLOCATE CC

SELECT *
FROM Table2

结果:

╔════════════╦═════════════╦════════════╦═════════╗
║ PRODUCT_ID ║ OriginalQTY ║ CurrentQty ║ BALANCE ║
╠════════════╬═════════════╬════════════╬═════════╣
║   11111111 ║          46 ║         12 ║      54 ║
║   11111111 ║          15 ║         40 ║      53 ║
║   22222222 ║           6 ║          1 ║       7 ║
║   22222222 ║          24 ║          6 ║      22 ║
║   22222222 ║          15 ║          8 ║      17 ║
╚════════════╩═════════════╩════════════╩═════════╝

是一个演示

于 2013-09-24T18:33:40.477 回答