运行一个表中的值总计,直到它与另一个表中的值匹配为止

时间:2018-10-09 19:10:43

标签: sql sql-server running-total database-cursor

我有2张桌子。

表1是一个临时变量表​​:

declare @Temp as table ( proj_num varchar(10), sum_dom decimal(23,8))

我的临时表中填充了一个项目编号列表,以及一个月底结算的美元金额。
例如:

proj_num |  sum_dom
11522    |  2477.15
11524    | 26474.20
41865    |  9012.10

表2是“项目事务处理”表。 我们只关注以下几列:

  • proj_num
  • amount
  • cost_code
  • tran_date

单个值将如下所示:

proj_num | cost_code | amount  | tran_date
11522    | LBR       |  112.10 | 10/1/2018
11522    | LBR       | 1765.90 | 10/2/2018
11522    | MAT       |  599.15 | 10/3/2018
11522    | FRT       |   57.50 | 10/4/2018

因此,对于此项目,由于在10/3上满足了总计2477.15美元的要求,因此示例输出为:

proj_num | cost_code | amount 
11522    |  LBR      | 1878.00
11522    |  MAT      | 599.15

我想对项目交易表下的金额(按cost_code分组,并按tran_date排序)求和,直到该项目值的总值与临时表的sum_dom列中的值匹配为止,此时我将输出该数据。

您能帮我弄清楚如何编写查询来做到这一点吗? 我知道我应该避免使用游标,但是到目前为止,我的尝试还没有很大的运气。我似乎无法保持运转状态。

1 个答案:

答案 0 :(得分:1)

运行总和使用SUM(...) OVER (ORDER BY ...)完成。您只需要告诉停在哪里:

SELECT sq.*
FROM projects
INNER JOIN (
    SELECT
        proj_num,
        cost_code,
        amount,
        SUM(amount) OVER (PARTITION BY proj_num ORDER BY tran_date) AS running_sum
    FROM project_transactions
) AS sq ON projects.proj_num = sq.proj_num
WHERE running_sum <= projects.sum_dom

DB Fiddle