Перестановки / комбинации MSSQL - поиск всех возможных совпадений с использованием подмножества данных - PullRequest
0 голосов
/ 21 декабря 2018

В MSSQL у меня есть таблица (ProductRecipe), которая содержит до 5 различных компонентов продуктов.Затем у меня есть набор данных, который содержит отдельные компоненты и их стоимость.

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

CREATE TABLE #ProductRecipe (ProductRecipeID INT, Component1 INT, Component2 INT, Component3 INT, Component4 INT, Component5 INT)
CREATE TABLE #ComponentPricing (RowID INT, PricingID INT, ProductID INT, ProductDescription VARCHAR(50), Cost DECIMAL(18,6))

INSERT INTO #ProductRecipe (ProductRecipeID, Component1, Component2) VALUES (21, 130, 468)
INSERT INTO #ComponentPricing (RowID, PricingID, ProductID, ProductDescription, Cost)
VALUES (1, 314023, 130, 'ULS2', 1.783800)
 , (2, 313616, 130, 'ULS2', 1.783800)
 , (3, 313071, 130, 'ULS2', 1.794000)
 , (4, 312865, 130, 'ULS2', 1.789500)
 , (5, 316323, 468, 'B100', 1.550500)

SELECT * FROM #ProductRecipe
SELECT * FROM #ComponentPricing

DROP TABLE #ProductRecipe
DROP TABLE #ComponentPricing

В результате я пытаюсь достичь того, что в итоге получаю4 различных варианта рецепта, поскольку первые 4 записи (для ProductID 130) можно смешивать с последней записью (ProductID 468).Только эти два продукта могут быть смешаны, потому что это два компонента, определенные в моей таблице ProductRecipe.

Желаемый результат: строки 1 + 5 идут вместе, строки 2 + 5 идут вместе, строки 3 + 5 идут вместе,Строки 4 + 5 идут вместе;Возвращение столбца PricingID.

ProductRecipeID Component1 Component2 Component3 Component4 Component5
21              314023     316323   
21              313616     316323   
21              313071     316323   
21              312865     316323   

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Рассмотрим несколько LEFT JOIN на самосоединенных таблицах:

SELECT p.ProductRecipeID, c1.PricingID AS Component1, c2.PricingID AS Component2,
       c3.PricingID AS Component3, c4.PricingID AS Component4
FROM #ProductRecipe p
LEFT JOIN #ComponentPricing c1
    ON p.Component1 = c1.ProductID   
LEFT JOIN #ComponentPricing c2
    ON p.Component2 = c2.ProductID
LEFT JOIN #ComponentPricing c3
    ON p.Component3 = c3.ProductID
LEFT JOIN #ComponentPricing c4
    ON p.Component4 = c4.ProductID

Rextester Demo

0 голосов
/ 21 декабря 2018

Посмотрите, работает ли это.

DECLARE @ProductRecipe TABLE (ProductRecipeID INT, Component1 INT, Component2 INT, Component3 INT, Component4 INT, Component5 INT) 
DECLARE @ComponentPricing TABLE (RowID INT, PricingID INT, ProductID INT, ProductDescription VARCHAR(50), Cost DECIMAL(18,6)) 

INSERT INTO @ProductRecipe (ProductRecipeID, Component1, Component2,Component3) VALUES (21, 130, 468,221)
INSERT INTO @ComponentPricing (RowID, PricingID, ProductID, ProductDescription, Cost)
VALUES (1, 314023, 130, 'ULS2', 1.783800)
 , (2, 313616, 130, 'ULS2', 1.783800)
 , (3, 313071, 130, 'ULS2', 1.794000)
 , (4, 312865, 130, 'ULS2', 1.789500)
 , (5, 316323, 468, 'B100', 1.550500)
 , (6, 316322, 221, 'B1110', 1.5250500)

;WITH UnpivotedRecipe AS
(
    SELECT 
        ProductRecipeID, ComponentID
    FROM
        (SELECT * FROM @ProductRecipe) AS P
        UNPIVOT(ComponentID FOR V IN(Component1,Component2,Component3,Component4,Component5))AS UP
)
, JoinedData AS
(
    SELECT 
        ProductRecipeID, ComponentID, RowID
    FROM 
        UnpivotedRecipe R
        INNER JOIN @ComponentPricing C ON C.ProductID = R.ComponentID

)
SELECT DISTINCT J1.ComponentID,J1.RowID,J2.ComponentID FROM JoinedData J1
CROSS JOIN JoinedData J2
WHERE
    J1.ComponentID<>J2.ComponentID
...