2012-05-23 20 views
0

我有一个库存交易表。我需要选择最近几笔交易的日期,直到调整后的数量大于库存中的当前金额。SUM直到某个点

我处理的三列:item, transaction_date, adj_qty。每个项目将有多个交易日期和调整数量。

我如何退还所有transaction_dates每个项目,直到该项目达到一定的阈值(即累计100)。说的第一个项目有2000个交易和过去五年的交易有各自的21中的数量,我想查询返回事务中的最后5因为那是当项目达到100

如果可能的话,我想这样做没有循环或光标。

任何人都可以帮忙吗?

回答

2

你需要的是累计和。这是内置到SQL Server 2012的

唉,有一点,你需要有一个自我做加盟:

select t.item, t.transaction_date, t.adj_qty, 
     sum(tprev.adj_qty) as CumSum 
from t t join 
    t tprev 
    on t.item = tprev.item and 
     t.transaction_date >= tprev.transaction_date 
group by t.item, t.transaction_date, t.adj_qty 
having 100 between sum(tprev.adj_qty) -t.adj_qty + 1 and sum(tprev.adj_qty) 

注意利用自身的加入,并通过组办的累计总和。不愉快,但必须在SUM()over(partition by)函数中没有order子句。这个累计总和从第一个记录(按交易日期)为一个项目添加到任何其他项目。

HAVING子句然后选择你正在寻找,那里的累计值增加该行的推移,一些门限。

+0

哇!这个解决方案非常棒!正是我需要的。非常感谢! – Jill

+0

我只是用这个想法来面对另一个挑战。这次倒退!减去之前的每一行。再次感谢你的帮助。 – Jill