我有一个库存交易表。我需要选择最后几笔交易的日期,直到调整后的数量大于库存中的当前金额。
我正在处理三个列:item, transaction_date, adj_qty。每个项目将有多个交易日期和调整数量。
如何返回每一项的所有transaction_dates,直到该项达到某个阈值(即累加100)。假设第一个项目有2000笔交易,最后五笔交易的数量都是21。我希望查询返回最后5个事务,因为那是当项目达到100的时候。
如果可能的话,我想在没有循环或游标的情况下这样做。
有人能帮上忙吗?
发布于 2012-05-24 02:44:44
你需要的是一个累积的总和。这已内置于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子句选择您正在查找的行,其中累积和已超过某个阈值。
https://stackoverflow.com/questions/10725846
复制相似问题