SUM直到某一点

时间:2012-05-23 18:34:53

标签: sql sql-server tsql

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

我正在处理三个专栏:item, transaction_date, adj_qty。每个项目都有多个交易日期和调整数量。

如何返回每个项目的所有transaction_dates,直到该项目达到某个阈值(即累积100)。假设第一个项目有2000个事务,最后五个事务的每个数量为21个。我希望查询返回最后5个事务,因为那时项目达到了100个。

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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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)

注意使用self join和group by来进行累积求和。不愉快,但必须没有SUM()over(partition by)函数中的order子句。此累积金额将项目的第一个记录(按交易日期)添加到任何其他项目。

HAVING子句然后选择你要寻找的行,累积和增加了一些阈值。