余额为负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个月的主要内容,如果未能解决你的问题,请参考以下文章

yp训练赛3/21

ABAP 如何使用select实现多值和输出 比如 十二个月的余额 输出为一年的余额

饭卡(01背包)

A - 饭卡

HDU 2546饭卡

饭卡(DP)