How about
WITHcte1 AS (SELECT a.id, a.account, a.deposit, SUM(a.deposit) OVER (PARTITION BY a.account ORDER BY a.id) AS 'total',max(b.budget) as budget
FROM #TestData a
INNER JOIN #TestBudget b on (a.account = b.account)
GROUP BY a.id, a.account, a.deposit
),
cte2 AS (SELECT*,budget-total AS RemainingBudget
FROM cte1
),
cte3 AS (SELECT *,
CASE
WHEN RemainingBudget>0 THEN Deposit
WHEN Deposit+RemainingBudget>0 THEN Deposit+RemainingBudget
ELSE 0
END AS InBudget
FROM cte2
)
SELECT*,
id,
account,
deposit,
InBudgetAS [Renewal],
deposit-InBudgetAS [Unbudgetted]
FROM cte3
Which gives results:
4Bills40400
5Bills50545
6Bills60060
7Party70700
8Party80080
1Vacation10100
2Vacation20155
3Vacation30030