В производстве часто возникают ситуации, когда определенные детали должны перемежаться при прохождении по производственной линии. В этой статье мы рассмотрим решение этой проблемы с использованием SQL Server.
Допустим, у нас есть два заказа на работу: один с количеством пять и цветом красным, а другой с количеством пять и цветом белым. Первая часть проблемы заключается в разделении двух строк заказа на десять строк на основе количества. Вторая проблема заключается в перемежении строк таким образом, чтобы мы получили одну красную строку, за которой следует одна белая строка.
Для решения этой проблемы мы можем создать таблицу с названием “OddEvenOrder” и вставить в нее данные заказа на работу. Затем мы можем использовать таблицу-талли, которая содержит строки с числами, чтобы разделить строки. Путем объединения таблицы заказа на работу с таблицей-талли мы можем сгенерировать необходимое количество строк для каждого заказа на работу.
После того, как мы разделили заказы на работы, нам нужно определить, как установить нечетные номера для первого заказа и четные номера для второго заказа. Мы можем достичь этого, добавив 0, 1, 2, 3, 4 к числам для нечетных строк и добавив 1, 2, 3, 4, 5 к числам для четных строк.
Затем нам нужно сгруппировать заказы на работы вместе на основе общего атрибута, такого как размер. Мы можем обновить столбец “UpdatedSortKey”, чтобы у обоих заказов на работу с одинаковым размером было одно и то же значение. Это позволит нам упорядочить красные и белые строки вместе.
Наконец, упорядочивая строки на основе вычисленного “UpdatedSortKey”, мы можем достичь желаемой последовательности строк.
Вот SQL-код, демонстрирующий решение:
CREATE TABLE dbo.OddEvenOrder( OddEvenOrderid INT NOT NULL IDENTITY(1,1), ScheduleNumber INT NOT NULL, WorkOrderNumber INT NOT NULL, Quantity INT NOT NULL, Color VARCHAR(20) NOT NULL, Size VARCHAR(20) NOT NULL, SortKey VARCHAR(50) NOT NULL, UpdatedSortKey VARCHAR(50) NULL, CONSTRAINT [PK_OddEvenOrder] PRIMARY KEY CLUSTERED ( [OddEvenOrderID] ASC ) ) CREATE TABLE [dbo].[Tally]( [Number] [int] NOT NULL, CONSTRAINT [PK_Tally] PRIMARY KEY CLUSTERED ( [Number] ASC ) ) INSERT INTO dbo.Tally (Number) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10) DECLARE @startingSerialNumber BIGINT = 1000000 SELECT OddEvenOrderid, ScheduleNumber, WorkOrderNumber, Quantity, Color, Size, SortKey, CASE WHEN oe.Quantity = 1 THEN SortKey+'00' ELSE updatedsortkey+RIGHT('0'+ CAST(ROW_NUMBER() OVER(PARTITION BY oe.UpdatedSortKey, oe.Color ORDER BY oe.WorkOrderNumber)+ CASE WHEN color = 'Red' THEN ROW_NUMBER() OVER(PARTITION BY oe.UpdatedSortKey ORDER BY oe.WorkOrderNumber)-1 ELSE ROW_NUMBER() OVER(PARTITION BY oe.UpdatedSortKey, oe.Color ORDER BY oe.WorkOrderNumber) END AS VARCHAR(3)),2) END AS 'CalcUpdatedSortKey', @startingSerialNumber - 1 + ROW_NUMBER() OVER(ORDER BY oe.WorkOrderNumber) AS 'SerialNumber' FROM dbo.OddEvenOrder oe JOIN dbo.Tally t ON t.Number BETWEEN 1 AND oe.Quantity ORDER BY CalcUpdatedSortKey
Выполнив вышеуказанный код, вы получите желаемые перемеженные строки на основе указанных критериев.
Надеюсь, вы найдете это решение полезным. Оно может быть применено в различных сценариях производства, где требуется перемежение строк. Не стесняйтесь использовать этот подход в своих собственных проектах.