Hi All,
I've added in a stock check which will override preference if all stock can be found in one location
CASE WHEN s.InStock >= p.OrderQuantity THEN 1 ELSE 0 END DESC
Which works fine for individual products , where ReserveFromShop > 0 code below.
DECLARE @Tmp TABLE (fruit VARCHAR(50), shop VARCHAR(10), preference INT, InStock INT)
INSERT INTO @Tmp (fruit,shop,preference,InStock) VALUES ('orange','shop1',1 ,4)
INSERT INTO @Tmp (fruit,shop,preference,InStock) VALUES ('orange','shop2',2 ,4)
INSERT INTO @Tmp (fruit,shop,preference,InStock) VALUES ('apple','shop2',1 ,5)
DECLARE @purchase TABLE (fruit varchar(50), OrderQuantity INT)
INSERT INTO @purchase (fruit, OrderQuantity)
VALUES ( 'orange', 2 )
,( 'apple', 4 )
--------------------------------------------------------------------------------------------
IF OBJECT_ID('Tempdb..#rankedData') IS NOT NULL DROP TABLE #rankedData;
SELECT rn = ROW_NUMBER() OVER(PARTITION BY s.fruit ORDER BY CASE WHEN s.InStock >= p.OrderQuantity THEN 1 ELSE 0 END DESC,s.Preference),
s.*,p.OrderQuantity
,max_rn = COUNT(*) OVER(PARTITION BY s.fruit)
INTO #rankedData
FROM @Tmp s
INNER JOIN @purchase p ON p.fruit = s.fruit
CREATE UNIQUE CLUSTERED INDEX ucx_Helper ON #rankedData (fruit, rn)
;WITH stockCalc AS (
SELECT tr.rn, tr.fruit, tr.shop, tr.preference, tr.InStock, tr.OrderQuantity, tr.max_rn,
ReservedFromShop = CASE WHEN tr.OrderQuantity > tr.InStock THEN tr.InStock ELSE tr.OrderQuantity END,
Outstanding = CASE WHEN tr.OrderQuantity > tr.InStock THEN tr.OrderQuantity - tr.InStock ELSE 0 END
FROM #rankedData tr
WHERE rn = 1
UNION ALL
SELECT tr.rn, tr.fruit, tr.shop, tr.preference, tr.InStock, tr.OrderQuantity, tr.max_rn,
ReservedFromShop = CASE WHEN lr.Outstanding > tr.InStock THEN tr.InStock ELSE lr.Outstanding END,
Outstanding = CASE WHEN lr.Outstanding > tr.InStock THEN lr.Outstanding - tr.InStock ELSE 0 END
FROM #rankedData tr -- this row
INNER JOIN stockCalc lr -- last row
ON lr.fruit = tr.fruit
AND lr.rn + 1 = tr.rn
)
SELECT * FROM stockCalc
UNION ALL
SELECT rn,fruit,'unassigned' AS shop,c.preference,c.InStock,c.OrderQuantity,c.ReservedFromShop,c.Outstanding, c.max_rn
FROM stockCalc c
WHERE rn = max_rn AND c.Outstanding > 0
ORDER BY fruit, rn;
DROP TABLE #rankedData;
But if i can find all fruit at one shop that should override all shop preferences and stock per fruit, so the fruit is not coming from multiple shops. In the output of the above code the orange should come from shop2 as this is where stock for the apple is.:crazy: