Sql server 库存转移的SQL挑战

Sql server 库存转移的SQL挑战,sql-server,tsql,Sql Server,Tsql,问题是:给定两个表,一组位置和Sku为轻库存,另一个表位置和Sku为重库存-如何创建另一个表,指示应将多余库存发送到何处 转账表将/可以有多条记录sku/位置/金额。假设一个位置没有足够的空间,那么将添加位置2。转移应该由那些拥有最多和最需要的人来安排。因此,如果一个位置有10个额外的,另一个位置有5个额外的,那么10个额外的位置首先转移库存 如果位置1有10个额外的sx1项目,位置2有5个额外的sx1项目。位置30需要12个sx1项目。他们应该从位置1得到10,从位置2得到2。可能还有另一个位

问题是:给定两个表,一组位置和Sku为轻库存,另一个表位置和Sku为重库存-如何创建另一个表,指示应将多余库存发送到何处

转账表将/可以有多条记录sku/位置/金额。假设一个位置没有足够的空间,那么将添加位置2。转移应该由那些拥有最多和最需要的人来安排。因此,如果一个位置有10个额外的,另一个位置有5个额外的,那么10个额外的位置首先转移库存

如果位置1有10个额外的sx1项目,位置2有5个额外的sx1项目。位置30需要12个sx1项目。他们应该从位置1得到10,从位置2得到2。可能还有另一个位置也需要它们

为了弄明白这一点,我一直把头撞在墙上,我只会提出一些奇怪的临时工问题,但这些问题根本不起作用

下面是一些创建临时表的代码。SQL Server 2017

DROP TABLE IF EXISTS #tempExcessInventory;
DROP TABLE IF EXISTS #tempNeededInventory;

CREATE TABLE #tempExcessInventory
(
             InventoryLocation VARCHAR(255)
            ,SKUName           VARCHAR(255)
            ,ExcessInventory   INT
);

CREATE TABLE #tempNeededInventory
(
             InventoryLocation VARCHAR(255)
            ,SKUName           VARCHAR(255)
            ,NeededInventory   INT
);

Insert into #tempExcessInventory
values 
('A1','SKUName1',7)
,('A2','SKUName2',1)
,('A3','SKUName3',10)
,('A4','SKUName4',4)
,('A5','SKUName5',2)
,('A6','SKUName6',10)
,('A7','SKUName7',2)
,('A8','SKUName8',8)
,('A9','SKUName9',5)
,('A10','SKUName10',9)
,('A11','SKUName11',3)
,('A12','SKUName12',3)
,('A13','SKUName13',8)
,('A14','SKUName14',3)
,('A15','SKUName15',9)
,('A16','SKUName16',10)
,('A17','SKUName17',6)
,('A18','SKUName18',4)
,('A19','SKUName19',3)
,('A20','SKUName20',10)
,('A21','SKUName21',3)
,('A22','SKUName22',7)
,('A23','SKUName23',3)
,('B1','SKUName1',2)
,('B2','SKUName2',9)
,('B3','SKUName3',5)
,('B4','SKUName4',5)
,('B5','SKUName5',10)
,('B6','SKUName6',9)
,('B7','SKUName7',9)
,('B8','SKUName8',9)
,('B9','SKUName9',3)
,('B10','SKUName10',5)
,('B11','SKUName11',4)
,('B12','SKUName12',6)
,('B13','SKUName13',1)
,('B14','SKUName14',10)
,('B15','SKUName15',1)
,('B16','SKUName16',9)
,('B17','SKUName17',3)
,('B18','SKUName18',7)
,('B19','SKUName19',9)
,('B20','SKUName20',4)
,('B21','SKUName21',8)
,('B22','SKUName22',5)
,('B23','SKUName23',1)


Insert into #tempNeededInventory
values 
('A1','SKUName1',5)
,('A2','SKUName2',2)
,('A3','SKUName3',10)
,('A4','SKUName4',3)
,('A5','SKUName5',10)
,('A6','SKUName6',9)
,('A7','SKUName7',1)
,('A8','SKUName8',4)
,('A9','SKUName9',5)
,('A10','SKUName10',8)
,('A11','SKUName11',3)
,('A12','SKUName12',2)
,('A13','SKUName13',6)
,('A14','SKUName14',8)
,('A15','SKUName15',8)
,('A16','SKUName16',8)
,('A17','SKUName17',7)
,('A18','SKUName18',6)
,('A19','SKUName19',9)
,('A20','SKUName20',10)
,('A21','SKUName21',9)
,('A22','SKUName22',8)
,('A23','SKUName23',7)
,('B1','SKUName1',2)
,('B2','SKUName2',3)
,('B3','SKUName3',3)
,('B4','SKUName4',9)
,('B5','SKUName5',5)
,('B6','SKUName6',8)
,('B7','SKUName7',2)
,('B8','SKUName8',5)
,('B9','SKUName9',1)
,('B10','SKUName10',7)
,('B11','SKUName11',1)
,('B12','SKUName12',6)
,('B13','SKUName13',7)
,('B14','SKUName14',5)
,('B15','SKUName15',8)
,('B16','SKUName16',10)
,('B17','SKUName17',5)
,('B18','SKUName18',6)
,('B19','SKUName19',7)
,('B20','SKUName20',10)
,('B21','SKUName21',8)
,('B22','SKUName22',2)
,('B23','SKUName23',4)

谢谢。

以下代码可能会有所帮助:

DROP TABLE IF EXISTS #FinalInventoryTransferTable;
CREATE TABLE #FinalInventoryTransferTable
(ExcessInventoryLocation VARCHAR(255), 
 ExcessInventory         INT, 
 SKUName                 VARCHAR(255), 
 NeededInventoryLocation VARCHAR(255), 
 NeededInventory         INT
);
DECLARE @InventoryLocation VARCHAR(100), @SKUName VARCHAR(100), @NeededInventory VARCHAR(100);
DECLARE cur CURSOR FAST_FORWARD
FOR SELECT InventoryLocation, 
           SKUName, 
           NeededInventory
    FROM #tempNeededInventory;
OPEN cur;
FETCH NEXT FROM cur INTO @InventoryLocation, @SKUName, @NeededInventory;
WHILE(@@FETCH_STATUS = 0)
    BEGIN
        WHILE(@NeededInventory > 0)
            BEGIN
                INSERT INTO #FinalInventoryTransferTable
                       SELECT t.InventoryLocation AS ExcessInventoryLocation, 
                              t.ExcessInventory, 
                              t.SKUName, 
                              @InventoryLocation AS NeededInventoryLocation, 
                              @NeededInventory AS NeededInventory
                       FROM
                       (
                           SELECT TOP 1 *
                           FROM #tempExcessInventory ei
                           WHERE ei.skuname = @SKUName
                                 AND @NeededInventory <= ei.ExcessInventory
                       ) t;
                UPDATE ei
                  SET 
                      ExcessInventory = CASE
                                            WHEN(@NeededInventory - ei.ExcessInventory) < 0
                                            THEN ABS(@NeededInventory - ei.ExcessInventory)
                                            ELSE 0
                                        END
                FROM #tempExcessInventory ei
                     JOIN #FinalInventoryTransferTable ft ON ei.skuname = @SKUName
                                            AND ei.InventoryLocation = ft.ExcessInventoryLocation
                                            AND @NeededInventory = ft.NeededInventory;
                SELECT @NeededInventory = CASE
                                              WHEN(@NeededInventory - ei.ExcessInventory) < 0
                                              THEN ABS(@NeededInventory - ei.ExcessInventory)
                                              ELSE 0
                                          END
                FROM #tempNeededInventory ni
                     LEFT JOIN #tempExcessInventory ei ON ei.skuname = @SKUName
                                                          AND ni.InventoryLocation = @InventoryLocation;
            END;
        FETCH NEXT FROM cur INTO @InventoryLocation, @SKUName, @NeededInventory;
    END;
CLOSE cur;
DEALLOCATE cur;
select * from #FinalInventoryTransferTable
--check remaining excess inventory
select * from #tempExcessInventory

请发布您的预期产出。您可能会从答案中得到一些想法,使用CTE根据库存分配订单。这让我走上了正确的方向。我在多余的表中添加了一列数量,以计算运行总数。最后,我还仔细检查了一下,以确保有足够的库存。否则可能会有一个无限循环。