2011-02-10 33 views
1

私は、販売注文を作成、テーブル構造は、だから私はSQL Serverのストアドプロシージャ

として請求書に製品を取得したいと思い

注文

 pack_ID  qty 
     ----------------- 
      4   500 

製品在庫

 pack_ID  batchNO  qty mfgDate 
     --------------------------------------- 
      4  ABC01  200 01/01/2010 
      4  XYZ02  1000 01/01/2010 

です

 pack_ID  batchNO  qty 
     ------------------------------ 
      4  ABC01  200 
      4  XYZ02  300  
+0

結果が200と300の場合の説明を記入してください。 – zerkms

+0

300のxyz02が500の数を作るのに必要です – RichardTheKiwi

+0

どのバージョンのSQL Server? – RichardTheKiwi

答えて

1

これを効率的に満たす再帰的クエリ

テーブルと一致しないデータタイプについて心配する必要はありません。重要なのは、正しく並べ替えることです。

/* 
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番目のものは、数量が満たされるまで在庫を集めます。

+0

ありがとうcyberkiwi。それはうまくいった。あなたは私をパニックから救った。 – Rauf

+0

しかし、場合によっては動作しない – Rauf

関連する問題