SQL查询返回以最新值开始的行,其值总和为另一个表中的值

SQL查询返回以最新值开始的行,其值总和为另一个表中的值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有两个表,表1有历史交易记录,表2有一个字段存储每个账户的交易余额 我需要一个SQL查询,它将返回表1中特定帐户的事务,从最新的事务开始,汇总到表2中的当前余额 任何帮助都将不胜感激 表1 UniqID。阿克特南。TranType。特兰达特。特兰蒙特 1.1001123 . . . . A.11/1/13 . . . . 100 2.1010877 . . . . B12/2/13 . . . . . 10 7.1010877 . . . . C12/2/13 . . . . . 22 10.

我有两个表,表1有历史交易记录,表2有一个字段存储每个账户的交易余额

我需要一个SQL查询,它将返回表1中特定帐户的事务,从最新的事务开始,汇总到表2中的当前余额

任何帮助都将不胜感激

表1

UniqID。阿克特南。TranType。特兰达特。特兰蒙特 1.1001123 . . . . A.11/1/13 . . . . 100 2.1010877 . . . . B12/2/13 . . . . . 10 7.1010877 . . . . C12/2/13 . . . . . 22 10. . . .. 1001123 . . . . A.12/2/14 . . . .-100 11. . . .. 1001123 . . . . B12/6/13 . . . . 145 12. . . .. 1003699 . . . . A.12/8/13 . . . . 250 13. . . .. 1001123 . . . . B1/2/14 . . . . . 145 14. . . . .1003699 . . . . C1/4/14 . . . . . 110 15. . . . .1003699 . . . . C1/4/14 . . . . .-110 19. . . . .1003699 . . . . B1/8/14 . . . . . . 25 21. . . . .1001123 . . . . B1/2/14 . . . . . . 80 22. . . . .1001123 . . . . B1/8/14 . . . . . . 45 26. . . . .1001123 . . . . A.1/21/14 . . . .-145

表2

阿克特南。特兰巴尔 1001123 . . . . 270 1003699 . . . . 275 1010877 . . . . . 32

账户1001123的预期结果

UniqID。阿克特南。TranType。特兰达特。特兰蒙特 11. . . .. 1001123 . . . . B12/6/13 . . . . 145 13. . . .. 1001123 . . . . B1/2/14 . . . . . 145 21. . . . .1001123 . . . . B1/2/14 . . . . . . 80 22. . . . .1001123 . . . . B1/8/14 . . . . . . 45 26. . . . .1001123 . . . . A.1/21/14 . . . .-145


好的,我想我现在明白了。首先,您将需要每个账户的总交易额。在SQL Server 2012中,这可以通过跨分区方便地完成:

SELECT t.AcctNum, t.TranAmt,t.TranDate, SUM(t.TranAmt) OVER(PARTITION BY t.AcctNum ORDER BY t.TranDate,t.UniqID)
FROM Transactions t
我使用UniqID是因为每个帐户的TranDate不是唯一的。在SQL Server 2008中,您不能使用OVER PARTITION,因为ORDER BY子句仅在SQL Server 2012中添加,因此我们必须在此处使用联接:

SELECT t1.AcctNum, t1.TranDate, t1.TranAmt, SUM(t2.TranAmt) running_total
FROM   Transactions t1,
        Transactions t2
WHERE t1.TranDate >= t2.TranDate AND t1.AcctNum=t2.AcctNum AND t1.UniqID>=t2.UniqID
GROUP BY t1.AcctNum, t1.TranDate, t1.TranAmt
ORDER BY t1.AcctNum, t1.TranDate
现在我们只需要running_total为0的行,因为它们为我们提供了可以丢弃事务数据的阈值日期:

    SELECT t1.AcctNum, t1.TranDate, t1.TranAmt, SUM(t2.TranAmt) running_total
    FROM   Transactions t1,
            Transactions t2
    WHERE t1.TranDate >= t2.TranDate AND t1.AcctNum=t2.AcctNum AND t1.UniqID>=t2.UniqID
    GROUP BY t1.AcctNum, t1.TranDate, t1.TranAmt
    HAVING SUM(t2.TranAmt)=0
    ORDER BY t1.AcctNum, t1.TranDate
最后,我们必须再次将这些阈值日期链接到事务表。我使用左连接并将阈值日期的行添加到事务中的任何行中,每个AcctNum的阈值日期等于或早于该日期。然后,我们可以丢弃这些,只保留日期比阈值日期新的行

SELECT *
FROM Transactions t
    LEFT JOIN (SELECT t1.AcctNum, t1.TranDate ThresholdDate, t1.TranAmt, SUM(t2.TranAmt) running_total
                FROM   Transactions t1,
                        Transactions t2
                WHERE t1.TranDate >= t2.TranDate AND t1.AcctNum=t2.AcctNum AND t1.UniqID>=t2.UniqID
                GROUP BY t1.AcctNum, t1.TranDate, t1.TranAmt
                HAVING SUM(t2.TranAmt)=0) td ON t.AcctNum=td.AcctNum AND t.TranDate<=td.ThresholdDate
WHERE td.AcctNum is null
ORDER BY t.AcctNum, t.TranDate

好啊您已经尝试过什么?不使用UniqID 1和10背后的逻辑?从技术上讲,UniqID 1和10将导致0,并且通过您的逻辑相加,也应该包括在内。但是,如果结果不是0呢?如果一个资产超过或低于任意数量,您希望将其包括在内吗?不确定OP的确切意思,但当他澄清时,这里有一个SQL小提琴可以玩弄:我只想拉组成现有资产负债表的交易。有些记录可能包含数年的交易,如果它们的总和为零,则不可逆。感谢您的帮助。我无法完成查询。ThresholdDate应该是一个单独的列吗?我看不出这是在子查询中创建的。该查询还应该返回一个帐户的记录,在本例中,1001123我处理了这些查询,在我的测试床上一切正常。你有什么错误?ThresholdDate在子查询中计算。它是一个日期,其中运行总数为零,这意味着在此日期之前的所有内容都可以丢弃。将该内容缩减为一个帐户只是Where子句中的一个小更改。。。