0

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

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

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

如果可能的话,我想在没有循环或光标的情况下执行此操作。

有人可以帮忙吗?

4

1 回答 1

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 子句然后选择您正在查找的行,其中累积总和已超过某个阈值。

于 2012-05-23T18:44:43.927 回答