我有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列中的值匹配为止,此时我将输出该数据。
您能帮我弄清楚如何编写查询来做到这一点吗? 我知道我应该避免使用游标,但是到目前为止,我的尝试还没有很大的运气。我似乎无法保持运转状态。
答案 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