运行 来自 table 的总值直到它匹配来自另一个 table 的值
Running total of values from a table until it matches value from another table
我有 2 个 tables。
Table 1 是临时变量 table:
declare @Temp as table ( proj_num varchar(10), sum_dom decimal(23,8))
我的临时 table 中填充了项目编号列表和月末会计美元金额。
例如:
proj_num | sum_dom
11522 | 2477.15
11524 | 26474.20
41865 | 9012.10
Table 2 是项目交易 table。
我们只关注以下列:
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
所以对于这个项目,由于 2477.15 美元的总金额在 10 月 3 日达到,示例输出将是:
proj_num | cost_code | amount
11522 | LBR | 1878.00
11522 | MAT | 599.15
我想对项目交易 table 下的金额(按 cost_code 分组,并按 tran_date 排序)求和,直到该项目值的总值与temp table 的 sum_dom 列中的值,此时我将输出该数据。
你能帮我弄清楚如何编写查询来做到这一点吗?
我知道我应该避免游标,但到目前为止,我的尝试运气不佳。我似乎无法让它保持 运行 总数。
运行 使用 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
我有 2 个 tables。
Table 1 是临时变量 table:
declare @Temp as table ( proj_num varchar(10), sum_dom decimal(23,8))
我的临时 table 中填充了项目编号列表和月末会计美元金额。
例如:
proj_num | sum_dom
11522 | 2477.15
11524 | 26474.20
41865 | 9012.10
Table 2 是项目交易 table。 我们只关注以下列:
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
所以对于这个项目,由于 2477.15 美元的总金额在 10 月 3 日达到,示例输出将是:
proj_num | cost_code | amount
11522 | LBR | 1878.00
11522 | MAT | 599.15
我想对项目交易 table 下的金额(按 cost_code 分组,并按 tran_date 排序)求和,直到该项目值的总值与temp table 的 sum_dom 列中的值,此时我将输出该数据。
你能帮我弄清楚如何编写查询来做到这一点吗? 我知道我应该避免游标,但到目前为止,我的尝试运气不佳。我似乎无法让它保持 运行 总数。
运行 使用 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