これを効率的に満たす再帰的クエリ
テーブルと一致しないデータタイプについて心配する必要はありません。重要なのは、正しく並べ替えることです。
/*
create table orders (pack_id int, qty int)
insert orders select 4, 500
create table stock (pack_id int, batchno int, qty int, mfgdate int)
insert stock select 4,1,200,1
insert stock select 4,3,1000,2
*/
-- target qty for a pack_id, or set these are SProc params
declare @packid int set @packid = 4
declare @qty int set @qty = 500
;with A as (
select *, rn=ROW_NUMBER() over (order by mfgdate, batchno)
from stock
where pack_id = @packid),
B as (
select pack_id, batchno, qty=case when qty>@qty then @qty else qty end, mfgdate, [email protected], rn
from A
where rn=1
union all
select A.pack_id, A.batchno, case when A.qty>to_go then to_go else A.qty end, A.mfgdate, @qty-A.qty, A.rn
from A
inner join B on A.rn=B.rn+1
where to_go > 0
)
select pack_id, batchno, qty, mfgdate
from B
order by mfgdate asc, batchno asc
2 CTEは、(あなたがCTEの再帰部にTOP /凝集体を使用することができない)順番に通過できるように、最初のCTEは、行番号を設定します。 2番目のものは、数量が満たされるまで在庫を集めます。
結果が200と300の場合の説明を記入してください。 – zerkms
300のxyz02が500の数を作るのに必要です – RichardTheKiwi
どのバージョンのSQL Server? – RichardTheKiwi