我有一份按日期列出的购买清单。例如:
项目代码,采购日期,采购数量
- XXX,2012年1月1日,10
- XXX、 2012年1月10日,5
对于该项目,我有相应的销售交易:
项目,销售日期,销售数量
- XXX,2012年1月2日,-5
- XXX、 2012年1月9日,-3
- XXX、 2012年1月11日,-3
我想获得一个SQL查询(没有光标),以获得每个采购订单数量的余额。I.e将每次购买(先进先出)运行到0。(用于存货账龄分析)
如何将"采购"与"销售"结合起来,以获得每个采购库存批次的剩余余额?这在没有光标的情况下可能吗?
是。
您将两个表union
放在一起,并对结果集运行一个连续的合计。
;with cte as
(
select itemcode, purchasedate as tdate, purchaseqty as qty from purchases
union
select itemcode, salesdate, salesqty from sales
)
select
t1.*,
SUM(t2.qty)
from cte t1
left join cte t2
on t1.tdate>=t2.tdate
and t1.item = t2.item
group by t1.item, t1.pdate, t1.qty
为了在任何特定时间获得剩余的股票,适用相同的本金。
select p1.*,
case when (select SUM(abs(qty)) from sales) > SUM(p2.qty) then 0
else SUM(p2.qty) - (select SUM(abs(qty)) from sales) end as stockremaining
from purchases p1
left join purchases p2 on p1.item = p2.item
and p2.purchasedate <= p1.purchasedate
group by p1.purchasedate, p1.item, p1.qty
给出
1 2012-01-01 10 0
1 2012-01-10 5 4