在SQL中识别帐户间转移

时间:2015-12-09 03:59:20

标签: sql-server finance banking

我在SQL中的表中有很多银行交易。

示例:http://sqlfiddle.com/#!6/6b2c8/1/0

我需要识别这两个链接帐户之间的交易。 “帐户”表(未显示)将这两个帐户链接到一个来源(用户)。

例如: 我有一个日常账户和一个储蓄账户。我可能不时将钱从我的日常账户转到我的储蓄账户(反之亦然)。

交易描述通常类似(从xxx转移到xxx /转移),通常在同一天,显然,相同的金额。

编辑:我现在有以下查询(dumbed down),适用于某些情况

基本上,我创建了2个临时表,其中所有提款和存款都符合某些标准。然后我根据一些要求(相同的交易金额,不同的帐户#等)将它们加入到一起。然后使用ROW_NUMBER函数,我已经订购哪些更有可能是账户间交易。

我现在遇到一个问题,例如:

从账户A转账到账户B $ 100

$ 100从账户B转移到账户C

我的查询将匹配帐户A和帐户C之间的转帐,然后帐户B只有一笔交易,且不会匹配。所以基本上,不是收回2排(2次存款,排队2次取款),我只获得1排(1次存款,1次取款),从A到B的转账:(

INSERT  INTO #Deposits
        SELECT  t.*
        FROM    dbo.Customer c
                INNER JOIN dbo.Source src ON src.AppID = app.AppID
                INNER JOIN dbo.Account acc ON acc.SourceID = src.SourceID
                INNER JOIN dbo.Tran t ON t.AccountID = acc.AccountID
        WHERE   c.CustomerID = 123
                AND t.Template = 'DEPOSIT'

INSERT  INTO #Withdrawals
        SELECT  t.*
        FROM    dbo.Customer c
                INNER JOIN dbo.Source src ON src.AppID = app.AppID
                INNER JOIN dbo.Account acc ON acc.SourceID = src.SourceID
                INNER JOIN dbo.Tran t ON t.AccountID = acc.AccountID
        WHERE   c.CustomerID = 123
                AND t.Template = 'WITHDRAWAL'

;WITH    cte
          AS ( SELECT   [...] , 
                        ROW_NUMBER() OVER ( PARTITION BY d.TranID ORDER BY SUM( CASE WHEN d.TranDate = d.TranDate THEN 2 ELSE 1 END), w.TranID  ) AS DepRN,
                        ROW_NUMBER() OVER ( PARTITION BY w.TranID ORDER BY SUM( CASE WHEN d.TranDate = d.TranDate THEN 2 ELSE 1 END ), d.TranID ) AS WdlRN
               FROM     #Withdrawal w
                        INNER JOIN d ON w.TranAmount = d.TranAmount -- Same transaction amount
                                               AND w.AccountID <> d.AccountID -- Different accounts, same customer
                                               AND w.TranDate BETWEEN d.TranDate AND DATEADD(DAY, 3, d.TranDate) -- Same day, or within 3 days
               GROUP BY [...]
             )
    SELECT  *
    FROM    cte
    WHERE cte.DepRN = cte.WdlRN

1 个答案:

答案 0 :(得分:1)

也许这是一个开始?我不认为我们有足够的信息来说明这是否可靠或会导致很多误报&#34;。

select t1.TransactionID, t2.TransactionID
from dbo.Transactions as t1 inner join dbo.Transactions as t2
    on      t2.AccountID = t2.AccountID
        and t2.TransactionDate = t1.TransactionDate
        and t2.TransactionAmount = t1.TransactionAmount
        and t2.TransactionID - t1.TransactionID between 1 and 20 -- maybe??
        and t1.TransactionDesc like 'Transfer from%'
        and t2.TransactionDesc like 'Transfer to%'
        and t2.TransactionID > t1.TransactionID