我有一個已成功查詢的交易表,以獲取每天的總金額,按scenario_id 磁區,如以下示例所示:
表:
交易
| 交易日期 | Scenario_id | 交易金額 |
|---|---|---|
| 2022 年 5 月 19 日 | 00000000 | $.01 |
| 2022 年 5 月 25 日 | 00000000 | 5.00 美元 |
| 2022 年 5 月 18 日 | 10000000 | 50 美元 |
| 2022 年 5 月 19 日 | 00000000 | $.01 |
| 2022 年 5 月 25 日 | 00000000 | 5.00 美元 |
| 2022 年 5 月 18 日 | 10000000 | 50 美元 |
過濾器
| 起始現金 | 開始日期 | 結束日期 |
|---|---|---|
| 50,000 美元 | 2022 年 5 月 19 日 | 2022 年 5 月 25 日 |
代碼:
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
當前結果
| 交易日期 | Scenario_id | net_daily | Forecasted_cash |
|---|---|---|---|
| 2022 年 5 月 19 日 | 00000000 | $.02 | 50,000.02 美元 |
| 2022 年 5 月 25 日 | 00000000 | 10 美元 | 50,010.02 美元 |
| 2022 年 5 月 18 日 | 10000000 | 100 美元 | 50,100 美元 |
但是,我希望將過濾后的時間線中的所有空日期填充為每天凈 0 美元,同時從前一天進行預測的現金運行總額:
期望的結果
| 交易日期 | Scenario_id | net_daily | Forecasted_cash |
|---|---|---|---|
| 2022 年 5 月 19 日 | 00000000 | $.02 | 50,000.02 美元 |
| 2022 年 5 月 20 日 | 00000000 | 0 美元。 | 50,000.02 美元 |
| 2022 年 5 月 21 日 | 00000000 | 0 美元。 | 50,000.02 美元 |
| 2022 年 5 月 22 日 | 00000000 | 0 美元。 | 50,000.02 美元 |
| 2022 年 5 月 23 日 | 00000000 | 0 美元。 | 50,000.02 美元 |
| 2022 年 5 月 24 日 | 00000000 | 0 美元。 | 50,000.02 美元 |
| 2022 年 5 月 25 日 | 00000000 | 10 美元 | 50,010.02 美元 |
| 2022 年 5 月 18 日 | 10000000 | 100 美元 | 50,100 美元 |
| 2022 年 5 月 19 日 | 10000000 | $0 | 50,100 美元 |
| 2022 年 5 月 20 日 | 10000000 | $0 | 50,100 美元 |
| 2022 年 5 月 21 日 | 10000000 | $0 | 50,100 美元 |
| 2022 年 5 月 22 日 | 10000000 | $0 | 50,100 美元 |
| 2022 年 5 月 23 日 | 10000000 | $0 | 50,100 美元 |
| 2022 年 5 月 24 日 | 10000000 | $0 | 50,100 美元 |
| 2022 年 5 月 25 日 | 10000000 | $0 | 50,100 美元 |
實作這一目標的最佳方法是什么?
uj5u.com熱心網友回復:
您需要生成日期串列,然后左連接到Transactions表。
CTEfilters_dates遞回地生成日期串列。CTEscenario獲得了獨特的Scenario_id. CTE按&trans匯總交易,因為您有多個具有相同日期的條目。的最終結果基本上是 datescenario_idForecasted_cashTransaction _Amountstarting_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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/478965.html
