余额为负3个月
Posted
技术标签:
【中文标题】余额为负3个月【英文标题】:Balance Negative for 3 months 【发布时间】:2017-05-30 02:43:06 【问题描述】:我有 3 张桌子。帐户。反式和平衡。
假设帐户只有 2 个帐户。帐号 1 和 2。
它们在Trans Table中都有多个事务。
Trans 表中的 Sum(Amount) 等于每个帐户在任何给定时间的余额。
例如:账户 1 和 2 都有 50 美元。账户 1 进行了 100 美元的交易,而账户 2 仅进行了 35 美元的交易。
现在,帐户 1 的余额为负 50 美元。假设他存入 20 美元。无论如何,余额仍然是负数。
我需要一个查询来检查从今天起连续 3 个月或更长时间的余额是否为负数。 (所以 sysdate 每当我运行它时)。尽管他有 20 美元的存款,但余额仍然是负数。
当我使用 trans 表中的 transdate 或 balance 表中的 lastupdate 作为 3 个月标准时,上述帐户不会被提取。虽然,它是负面的,但它看到了一笔交易。
我想知道如何查询只有在连续 3 个月或更长时间为负数时才会在哪里显示帐号和余额,而不管交易何时发生。
列:
Account Table has AccountID
Trans Table has AccountID, Amount, TransDate
Balance Table has AccountID, Balance, LastUpdate
谢谢
更新
Trans Table
Select * from trans where accountid = 1;
Transdate Merchant Amount AccountID
10/1/16 Employer 50 1
10/4/16 Walmart -20 1
10/7/16 Kroger -50 1
现在,他的帐户在 2016 年 10 月 7 日变成了负数 - 20 美元。
Transdate Merchant Amount AccountID
12/01/16 Employer 10 1
他的帐户仍然是负数。如果我今天(2017 年 1 月 15 日)或更晚运行查询,他的帐户应该会被提取,因为他至少 90 天仍有负余额。
Balance Table
每个帐户仅保留 1 条记录。 截至今天,它显示以下内容:
AccountID Balance LastUpdate
1 -10 12/01/2016
LastUpdate 与 Trans Table 中该帐户的最后交易日期相同。
即使最后一笔存款是昨天来的,但这些账户仍然是负数,我正在为如何找到 90 天或更长时间为负数的账户而发疯。我需要为 50,000 个帐户执行此操作....
【问题讨论】:
能否提供一些示例数据? 我没有看到任何表示交易类型的列(存款与取款)。如何从 Trans 表中计算余额? 请提供Minimal, Complete, and Verifiable example of data in your tables 我在上面添加了示例数据。谢谢 【参考方案1】:我们将为所有交易计算一个运行余额。然后,我们将为每个帐户选择最近的交易,并将这些交易过滤到仅满足以下条件的交易:
-
最近的交易超过 90 天;或
过去 90 天的最大余额小于 0。
;
WITH running_total AS (
SELECT t.AccountID
,t.Transdate
,t.Amount
,SUM(t.Amount) OVER (PARTITION BY t.AccountID ORDER BY t.Transdate ROWS UNBOUNDED PRECEDING) AS RunningTotal
FROM (
-- Aggregate transctions by Account and Date
SELECT t.AccountID
,t.Transdate
,SUM(t.Amount) AS Amount
FROM Trans
GROUP BY t.AccountID
,t.Transdate
) t
)
SELECT *
FROM running_total rt
WHERE
-- Most recent transaction
rt.Transdate = (
SELECT MAX(Transdate)
FROM running_total
WHERE AccountID = rt.AccountID
)
-- Current balance is negative
AND rt.RunningTotal < 0
-- Get maximum balance for all transctions in the past 90 days
-- If none found (most recent transaction more than 90 days old),
-- substitute -1
AND COALESCE((
SELECT MAX(RunningTotal)
FROM running_total
WHERE AccountID = rt.AccountID
AND Transdate >= DATEADD(DAY, -90, GETDATE())
), -1) < 0
【讨论】:
请看上面的示例数据。 @Amir,我根据您问题中的 Update 更新了答案。以上是关于余额为负3个月的主要内容,如果未能解决你的问题,请参考以下文章