Повторяющаяся строка на основе других значений столбцов - PullRequest
1 голос
/ 22 мая 2019

Я извлекаю заказы из таблицы, каждый заказ имеет статус и время выполнения заказа.Заказ переходит от статуса в точном порядке следующим образом: «размещен»> «подтвержден»> «отправлен»

Строки выглядят как

id_order    dsc_status  lead
1           placed      8
1           confirmed   5
1           shipped     1

Мне нужно вернуть:

id_order    dsc_status  lead     iter
    1           placed      8    0
    1           placed      8    1
    1           placed      8    2
    1           placed      8    3
    1           confirmed   5    0
    1           confirmed   5    1
    1           confirmed   5    2
    1           confirmed   5    3
    1           confirmed   5    4
    1           shipped     1    0
    1           shipped     1    1

Логика : В данном примере разница времени выполнения между помещенным и подтвержденным составляет 3, поэтому я повторяю размещенный ряд 4 раза (отсчет на основе 0), то же самое для подтвержденного> отправленного.Для отправленных товаров мы повторяем, как если бы следовал фиктивный статус с опережением = 0, что означает, что мы повторяем 2 раза, пожалуйста, проверьте результаты.

1 Ответ

1 голос
/ 22 мая 2019

Вы можете использовать КУРСОР, чтобы получить желаемый результат-

DECLARE @id_order INT
DECLARE @id_Status_order INT
DECLARE @dsc_statue VARCHAR(100)
DECLARE @lead INT

DECLARE @LoopCount INT

DECLARE @TmpTable TABLE
(
    id_order INT,    dsc_status VARCHAR(200),  lead INT,     iter INT
)

DECLARE @id_order_prev INT
DECLARE @dsc_statue_prev VARCHAR(100)
DECLARE @lead_prev INT

DECLARE db_cursor CURSOR FOR 
SELECT id_order,Status_Order,dsc_status,lead
FROM 
(
    SELECT id_order,dsc_status,lead, 
    CASE 
        WHEN dsc_status = 'placed' THEN 1 
        WHEN dsc_status = 'confirmed' THEN 2
        WHEN dsc_status = 'shipped' THEN 3
    END Status_Order
    FROM your_table
)A
ORDER BY 1,2

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @id_order,@id_Status_order ,@dsc_statue,@lead

WHILE @@FETCH_STATUS = 0  
BEGIN

    IF @id_order_prev IS NULL
    BEGIN

        SET @id_order_prev = @id_order
        SET @dsc_statue_prev = @dsc_statue
        SET @lead_prev = @lead

    END

    ELSE
    BEGIN
        SET @LoopCount  = 0 

        WHILE @LoopCount <= CASE WHEN @id_order_prev = @id_order THEN ABS(@lead_prev-@lead) ELSE @lead_prev END
        BEGIN

           INSERT INTO @TmpTable (id_order,dsc_status,lead,iter)
           VALUES (@id_order_prev,@dsc_statue_prev,@lead_prev,@LoopCount)

           SET @LoopCount = @LoopCount + 1
        END

        SET @id_order_prev = @id_order
        SET @dsc_statue_prev = @dsc_statue
        SET @lead_prev = @lead
    END



    FETCH NEXT FROM db_cursor INTO @id_order,@id_Status_order ,@dsc_statue,@lead

    IF  @@FETCH_STATUS <> 0
    BEGIN 

        SET @LoopCount = 0
        WHILE @LoopCount <= @lead
        BEGIN

           INSERT INTO @TmpTable (id_order,dsc_status,lead,iter)
           VALUES (@id_order_prev,@dsc_statue_prev,@lead_prev,@LoopCount)

           SET @LoopCount = @LoopCount + 1
        END

    END
END 



CLOSE db_cursor  
DEALLOCATE db_cursor 


SELECT * 
FROM @TmpTable
ORDER BY 1
...