CTE - рекурсивное обновление количества до полного потребления

Я исследовал CTE, пытаясь определить, можно ли рекурсивно обновлять записи инвентарного количества с количеством заказа до тех пор, пока количество заказа не будет израсходовано.

Вот таблицы и записи:

CREATE TABLE [dbo].[myOrder](
  [Account] [float] NOT NULL,
  [Item] [float] NOT NULL,
  [Quantity] [float] NOT NULL
) ON [PRIMARY]

insert into dbo.myOrder values (12345, 1, 50)

CREATE TABLE [dbo].[myInventory](
  [ID] [int] IDENTITY(1,1) NOT NULL,
  [Account] [float] NOT NULL,
  [InvDate] [numeric](18, 0) NOT NULL,
  [Item] [float] NOT NULL,
  [Quantity] [float] NOT NULL,
  [QuantitySold] [float] NOT NULL
) ON [PRIMARY]

insert into dbo.myInventory values (12345, 111287, 1, 45, 40)
insert into dbo.myInventory values (12345, 111290, 1, 40, 0)
insert into dbo.myInventory values (12345, 111290, 1, 12, 0)
insert into dbo.myInventory values (12345, 111291, 1, 25, 0)

Запись в таблице myOrder показывает, что заказ должен быть создан для счета 12345 для товара №1, количество 50:

Account Item Quantity 
------- ---- --------
12345   1    50

Таблица инвентаризации показывает, что у нас много товара №1 на счету 12345:

ID Account InvDate Item Quantity QuantitySold
-- ------- ------- ---- -------- ------------
1  12345   111287  1    45       40
2  12345   111290  1    40       0
3  12345   111290  1    12       0
4  12345   111291  1    25       0

Цель состоит в том, чтобы начать вставлять количество заказа 50 в записи инвентаризации, пока все 50 не будут израсходованы. Записи инвентаризации упорядочены по значению в столбце InvDate. В записи 1 осталось 5 единиц товара (45 - 40 = 5), что оставляет нам 45 единиц товара для выполнения заказа. Запись 2 может израсходовать 40. Запись 3 может израсходовать последние 5. После завершения запроса записи инвентаризации будут выглядеть следующим образом:

ID Account InvDate Item Quantity QuantitySold
-- ------- ------- ---- -------- ------------
1  12345   111287  1    45       45
2  12345   111290  1    40       40
3  12345   111290  1    12       5
4  12345   111291  1    25       0

Примечание: В таблице инвентаризации хранится QuantitySold, а не QuantityRemaining, поэтому для определения количества, оставшегося для каждой записи инвентаризации, необходимо выполнить вычисления (Quantity - QuantitySold).

Я почти нигде не смог разобраться с CTE. Я нашел много примеров для выполнения селектов, где у вас есть 2 части CTE - часть инициализации и рекурсивная часть, объединенные вместе. Я могу написать это с помощью курсора, но я думаю, что это можно сделать с помощью CTE, и я хотел бы узнать как.

Если кто-то может подтвердить, что это возможно с помощью CTE или объяснить, как настроить CTE, я буду благодарен. Спасибо!

9
задан Andriy M 21 October 2011 в 13:05
поделиться