如何在没有交易发生的日子插入日期时按日期获得 运行 总数
How to get a running total by date while inserting dates for days when no transactions occurred
我有 table 笔交易,我已成功查询以获得每天的 运行 总金额,按 scenario_id 划分,如下例所示:
表格:
事务
Transaction Date
Scenario_id
transaction_amount
5/19/2022
00000000
$.01
5/25/2022
00000000
.00
5/18/2022
10000000
5/19/2022
00000000
$.01
5/25/2022
00000000
.00
5/18/2022
10000000
过滤器
starting_cash
start_date
end_date
,000
5/19/2022
5/25/2022
代码:
SELECT transaction_date, scenario_id, SUM(transaction_amount) AS net_daily,
(SELECT filters.starting_cash
FROM filters) + SUM(SUM(transaction_amount)) OVER (PARTITION BY scenario_id
ORDER BY transaction_date) AS forecasted_cash
FROM Transactions
WHERE transaction_date >=
(SELECT filters.start_date
FROM filters)
GROUP BY transaction_date, scenario_id
当前结果
Transaction Date
Scenario_id
net_daily
Forecasted_cash
5/19/2022
00000000
$.02
,000.02
5/25/2022
00000000
,010.02
5/18/2022
10000000
0
,100
但是,我希望在进行前一天的预测现金总额 运行 的同时,过滤时间轴中的所有空日期,以便每天填充 0 美元净额:
想要的结果
Transaction Date
Scenario_id
net_daily
Forecasted_cash
5/19/2022
00000000
$.02
,000.02
5/20/2022
00000000
[=15=].
,000.02
5/21/2022
00000000
[=15=].
,000.02
5/22/2022
00000000
[=15=].
,000.02
5/23/2022
00000000
[=15=].
,000.02
5/24/2022
00000000
[=15=].
,000.02
5/25/2022
00000000
,010.02
5/18/2022
10000000
0
,100
5/19/2022
10000000
[=15=]
,100
5/20/2022
10000000
[=15=]
,100
5/21/2022
10000000
[=15=]
,100
5/22/2022
10000000
[=15=]
,100
5/23/2022
10000000
[=15=]
,100
5/24/2022
10000000
[=15=]
,100
5/25/2022
10000000
[=15=]
,100
完成此任务的最佳方法是什么?
您需要生成日期列表,然后左联接到 Transactions
table。
CTE filters_dates
递归生成日期列表。 CTE scenario
得到不同的 Scenario_id
。 CTE trans
按 date
和 scenario_id
汇总交易,因为您有多个相同日期的条目。 Forecasted_cash
的最终结果基本上是 运行 一共 Transaction _Amount
+ starting_cash
with
filters_dates as
(
select starting_cash, start_date, end_date, trans_date = start_date
from Filters
union all
select starting_cash, start_date, end_date, trans_date = dateadd(day, 1, trans_date)
from filters_dates
where trans_date < end_date
),
scenario as
(
select distinct Scenario_id
from Transactions
),
trans as
(
select trans_date = transaction_date, Scenario_id, trans_amount = sum(transaction_amount)
from Transactions
group by transaction_date, Scenario_id
)
select f.trans_date,
s.Scenario_id,
net_daily = isnull(t.trans_amount, 0),
Forecasted_cash = f.starting_cash
+ sum(isnull(t.trans_amount, 0)) over (partition by s.Scenario_id
order by f.trans_date)
from filters_dates f
cross join scenario s
left join trans t on f.trans_date = t.Trans_Date
and s.Scenario_id = t.Scenario_id
order by s.Scenario_id, f.trans_date;
我有 table 笔交易,我已成功查询以获得每天的 运行 总金额,按 scenario_id 划分,如下例所示:
表格:
事务
Transaction Date | Scenario_id | transaction_amount |
---|---|---|
5/19/2022 | 00000000 | $.01 |
5/25/2022 | 00000000 | .00 |
5/18/2022 | 10000000 | |
5/19/2022 | 00000000 | $.01 |
5/25/2022 | 00000000 | .00 |
5/18/2022 | 10000000 |
过滤器
starting_cash | start_date | end_date |
---|---|---|
,000 | 5/19/2022 | 5/25/2022 |
代码:
SELECT transaction_date, scenario_id, SUM(transaction_amount) AS net_daily,
(SELECT filters.starting_cash
FROM filters) + SUM(SUM(transaction_amount)) OVER (PARTITION BY scenario_id
ORDER BY transaction_date) AS forecasted_cash
FROM Transactions
WHERE transaction_date >=
(SELECT filters.start_date
FROM filters)
GROUP BY transaction_date, scenario_id
当前结果
Transaction Date | Scenario_id | net_daily | Forecasted_cash |
---|---|---|---|
5/19/2022 | 00000000 | $.02 | ,000.02 |
5/25/2022 | 00000000 | ,010.02 | |
5/18/2022 | 10000000 | 0 | ,100 |
但是,我希望在进行前一天的预测现金总额 运行 的同时,过滤时间轴中的所有空日期,以便每天填充 0 美元净额:
想要的结果
Transaction Date | Scenario_id | net_daily | Forecasted_cash |
---|---|---|---|
5/19/2022 | 00000000 | $.02 | ,000.02 |
5/20/2022 | 00000000 | [=15=]. | ,000.02 |
5/21/2022 | 00000000 | [=15=]. | ,000.02 |
5/22/2022 | 00000000 | [=15=]. | ,000.02 |
5/23/2022 | 00000000 | [=15=]. | ,000.02 |
5/24/2022 | 00000000 | [=15=]. | ,000.02 |
5/25/2022 | 00000000 | ,010.02 | |
5/18/2022 | 10000000 | 0 | ,100 |
5/19/2022 | 10000000 | [=15=] | ,100 |
5/20/2022 | 10000000 | [=15=] | ,100 |
5/21/2022 | 10000000 | [=15=] | ,100 |
5/22/2022 | 10000000 | [=15=] | ,100 |
5/23/2022 | 10000000 | [=15=] | ,100 |
5/24/2022 | 10000000 | [=15=] | ,100 |
5/25/2022 | 10000000 | [=15=] | ,100 |
完成此任务的最佳方法是什么?
您需要生成日期列表,然后左联接到 Transactions
table。
CTE filters_dates
递归生成日期列表。 CTE scenario
得到不同的 Scenario_id
。 CTE trans
按 date
和 scenario_id
汇总交易,因为您有多个相同日期的条目。 Forecasted_cash
的最终结果基本上是 运行 一共 Transaction _Amount
+ starting_cash
with
filters_dates as
(
select starting_cash, start_date, end_date, trans_date = start_date
from Filters
union all
select starting_cash, start_date, end_date, trans_date = dateadd(day, 1, trans_date)
from filters_dates
where trans_date < end_date
),
scenario as
(
select distinct Scenario_id
from Transactions
),
trans as
(
select trans_date = transaction_date, Scenario_id, trans_amount = sum(transaction_amount)
from Transactions
group by transaction_date, Scenario_id
)
select f.trans_date,
s.Scenario_id,
net_daily = isnull(t.trans_amount, 0),
Forecasted_cash = f.starting_cash
+ sum(isnull(t.trans_amount, 0)) over (partition by s.Scenario_id
order by f.trans_date)
from filters_dates f
cross join scenario s
left join trans t on f.trans_date = t.Trans_Date
and s.Scenario_id = t.Scenario_id
order by s.Scenario_id, f.trans_date;