簡體   English   中英

SQL Server存儲過程

[英]Sql Server stored procedures

我創建一個銷售訂單,表結構為

訂購

       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    

您可以使用遞歸查詢來有效地滿足此要求。

不必擔心數據類型與表不匹配,重要的一點是它們的順序正確。

/*
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, to_go=@qty-qty, 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

第一個CTE設置行號,以便第二個CTE可以順序通過它們(您不能在CTE的遞歸部分中使用TOP /聚合); 然后第二個收集庫存直到數量滿足

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM