SQL Испытание с инвентарными переводами - PullRequest
0 голосов
/ 07 марта 2020

Вот проблема: даны 2 таблицы, набор локаций и Sku, которые являются легким инвентарем, и другая таблица (локации и sku), которые являются тяжелым инвентарем - как мне go о создании другой таблицы, которая указывает, где я следует отправить лишний инвентарь?

Таблица переносов будет / может иметь несколько записей (sku / location / amount). Скажем, одной локации недостаточно, тогда будет добавлена ​​локация 2. Переводы должны заказывать те, у кого больше всего, и те, которые нуждаются больше всего. Таким образом, если в одной локации есть 10 дополнительных, а в другой - 5 дополнительных, сначала добавляется 10 дополнительных.

Если в локации 1 есть 10 дополнительных предметов sx1, а в локации 2 - 5 дополнительных предметов sx1. Местоположение 30 нуждается в 12 sx1 пунктах. Они должны получить 10 из местоположения 1 и 2 из местоположения 2. Может быть другое местоположение, которое также нуждается в них.

Я бился головой о стену, чтобы понять это, и я только задаю странные временные запросы, которые не работают.

Вот некоторый код для создания временных таблиц. SQL Сервер 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)

Спасибо.

1 Ответ

1 голос
/ 07 марта 2020

Может помочь следующий код:

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

db <> fiddle demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...