SQL Запрос на поиск ближайшего совпадения для продуктов в одной коробке - PullRequest
0 голосов
/ 18 февраля 2020

В последнее время склад моей компании начал получать комплектные товары (мы называем их «комплектами»), в которых в одной и той же коробке находятся разные товары (чаще всего разных размеров).

Мы храним их по мере получения.

Однако, когда у нас нет ни одного предмета для отправки (не входящего в комплект), нам нужно открыть комплект, и они разбивают все предметы на отдельные ящики.

Я изо всех сил пытаюсь сделать запрос, который вернет самый старый (ОК, я могу отсортировать по table_ID desc) и самое близкое совпадение.

Моя цель, при условии наличия списка предметов и количеств, всегда найти «лучшее совпадение», так что в итоге у меня будет меньше работы (и ящиков) для разделения.

Рассмотрим образец из моего инвентаря (в реальной таблице гораздо больше данных и столбцов, таких как местоположение, склад, цена). , et c, но они не нужны для примера):

В этом примере, если меня попросят достать 2 маленькие синие рубашки, ожидаемый доход должен быть комплектом № 5 и 6, потому что :

  • наборы № 5 и d 6 - «самый близкий матч» (был бы «идеальный матч», ЕСЛИ я также попросил 2 средних синего цвета) - средняя рубашка - «сопутствующий урон», и тогда я все равно ее распакую
  • комплекты от 1 до 4 следует отбросить, так как они наихудшие (у них внутри БОЛЬШОЙ)
  • комплект № 7 также является кандидатом. Тем не менее, поскольку внутренняя рубашка другого цвета, в ie с первым правилом, она должна быть менее предпочтительной

enter image description here

SQL Сервер 2016 SP2 - Standard Edition

1 Ответ

0 голосов
/ 18 февраля 2020

Как вы думаете, может работать следующее? (прокомментировал некоторые части, чтобы увидеть всю картину)

WITH Temp
AS (SELECT *,
           SUBSTRING(SKU, 1, CHARINDEX('_', SKU) - 1) AS Color,
           SUBSTRING(
                        SKU,
                        CHARINDEX('_', SKU) + 1,
                        CHARINDEX('-', SUBSTRING(SKU, CHARINDEX('_', SKU) + 1, CHARINDEX('-', SKU))) - 1
                    ) AS Product,
           REVERSE(SUBSTRING(REVERSE(SKU), 1, CHARINDEX('-', REVERSE(SKU)) - 1)) AS Size
    FROM dbo.Table_2),
     BestPick
AS (SELECT T.Kit_Number,
           T.QTY,
           T.Color,
           T.Product,
           T.Size,
           COUNT(T.QTY) OVER (PARTITION BY T.Kit_Number) AS Sum_KitCount
    FROM Temp AS T)
SELECT STRING_AGG(B.Kit_Number, ', ') AS BestPick,
       SUM(B.QTY) AS Total_IN_Kits,
       B.Color,
       B.Product,
       B.Size
FROM BestPick AS B
--WHERE B.Color = 'Blue'
--      AND B.Size = 'Small'
GROUP BY B.Color,
         B.Product,
         B.Size,
         B.Sum_KitCount
--HAVING SUM(B.QTY) >= 2
ORDER BY SUM(B.QTY);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...