我有两个表,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
答案 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