我有三张桌子。账号。反式和平衡。
假设帐户只有两个帐户。帐号1和2。
它们都有跨表中的多个事务。
Trans表中的总和(金额)等于每个帐户在任何给定时间的余额。
例如:账户1和2都有50美元。账户1的交易金额为100美元,而账户2的交易价格仅为35美元。
现在,帐户1的余额为负50美元。假设他存了20美元。无论如何,余额仍然是负数。
我需要一个查询,检查余额连续3个月或更长时间是负的,从今天的日期。(每当我运行这个程序时,我都会这样做)。虽然他有20美元的存款,但余额仍然是负数。
当我使用从转换表或从平衡表的最新更新作为一个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年7月10日,他的账户出现了负增长( -$20 )。
Transdate Merchant Amount AccountID
12/01/16 Employer 10 1
他的帐户仍然是负数。如果我今天运行查询(01/15/2017)或以后,他的帐户应该会被取走,因为他至少有90天的负结余。
Balance Table
它只保存了一个帐户的记录。截至今天,报告显示如下:
AccountID Balance LastUpdate
1 -10 12/01/2016
LastUpdate与该帐户的transaction中的最后一个交易日期相同。
我正在疯狂地寻找那些已经负了90天或更长时间的账户,即使最后一笔存款是昨天收到的,但账户仍然是负数。我有50,000个账户我需要这样做.
发布于 2017-01-14 23:35:36
我们将为所有事务计算一个运行余额的。然后,我们将为每个帐户选择最近的事务处理,并将其过滤到以下内容:
;
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
https://stackoverflow.com/questions/41656427
复制