【问题标题】:SUM until a certain pointSUM 直到某个点
【发布时间】:2012-05-23 18:34:52
【问题描述】:

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

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

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

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

有人可以帮忙吗?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    你需要的是一个累积的总和。这是内置在 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 子句然后选择您要查找的行,其中累积总和已超过某个阈值。

    【讨论】:

    • 哇!这个解决方案太棒了!正是我需要的。非常感谢!
    • 我只是将这个想法用于我遇到的另一个挑战。这次倒着做!从前一行中减去每一行。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2020-02-17
    • 2014-09-25
    相关资源
    最近更新 更多