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

时间:2014-05-30 21:53:10

标签: sql sql-server sql-server-2008

我有两个表,Table1有历史记录,Table2有一个字段,用于存储每个帐户的这些事务的余额。

我需要一个SQL query来返回Table1中特定帐户的交易,从最新的交易开始,总计到Table2中的当前余额。

非常感谢任何帮助。

表1

  

UniqID。 AcctNum。 TranType。 TranDate。 TranAmt
  1。 。 。 。 。 1001123。 。 。 。一个 。 。 。 。 。 11/1/13。 。 。 。 100个
  2。 。 。 。 。 1010877。 。 。 。 B。 。 。 。 。 12/2/13。 。 。 。 。 10个
  7。 。 。 。 。 1010877。 。 。 。 C 。 。 。 。 。 12/2/13。 。 。 。 。 22个
  10。 。 .. 1001123。 。 。 。一个 。 。 。 。 。 12/2/14。 。 。 。-100
  11。 。 .. 1001123。 。 。 。 B。 。 。 。 。 12/6/13。 。 。 。 145个
  12。 。 .. 1003699。 。 。 。一个 。 。 。 。 。 12/8/13。 。 。 。 250个
  13.。 。 .. 1001123。 。 。 。 B。 。 。 。 。 1/2/14。 。 。 。 。 145个
  14。 。 。 .1003699。 。 。 。 C 。 。 。 。 。 1/4/14。 。 。 。 。 110个
  15。 。 。 .1003699。 。 。 。 C 。 。 。 。 。 1/4/14。 。 。 。 。-110
  19。 。 。 .1003699。 。 。 。 B。 。 。 。 。 1/8/14。 。 。 。 。 。 25个
  21.。 。 。 .1001123。 。 。 。 B。 。 。 。 。 1/2/14。 。 。 。 。 。 80个
  22。 。 。 .1001123。 。 。 。 B。 。 。 。 。 1/8/14。 。 。 。 。 。 45个
  26。 。 。 .1001123。 。 。 。一个 。 。 。 。 。 2014年1月21日。 。 。 。-145

表2

  

AcctNum。 TranBal
  1001123。 。 。 。 270个
  1003699 。 。 。 275个
  1010877。 。 。 。 。 32个
  

帐户1001123的预期结果

  

UniqID。 AcctNum。 TranType。 TranDate。 TranAmt
  11。 。 .. 1001123。 。 。 。 B。 。 。 。 。 12/6/13。 。 。 。 145个
  13.。 。 .. 1001123。 。 。 。 B。 。 。 。 。 1/2/14。 。 。 。 。 145个
  21.。 。 。 .1001123。 。 。 。 B。 。 。 。 。 1/2/14。 。 。 。 。 。 80个
  22。 。 。 .1001123。 。 。 。 B。 。 。 。 。 1/8/14。 。 。 。 。 。 45个
  26。 。 。 .1001123。 。 。 。一个 。 。 。 。 。 2014年1月21日。 。 。 。-145

1 个答案:

答案 0 :(得分:0)

好吧,我想我现在明白了。首先,每个AcctNum需要运行总计TranAmt。在SQL Server 2012中,可以通过OVER PARTITION方便地完成:

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并非每个AcctNum都是唯一的。在SQL Server 2008中,您无法使用OVER PARTITION,因为ORDER BY子句仅在SQL Server 2012中添加,因此我们必须在此处使用JOIN:

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

最后,我们必须再次将这些阈值日期链接到Transaction表。我使用左连接并将具有阈值日期的行添加到Transaction中等于或在该日期之前的任何行(每个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