[英]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.