1

表具有如下所示的数据。它包含两个帐号的数据

P_ID AcctNo 日期 金额
1 111A 04/03/2011 -331
2 111A 04/03/2011 600
3 111A 04/03/2011 20000
4 111A 05/03/2011 -20000
5 111A 10/03/2011 -260
6 111B 01/08/2011 2
7 111B 12/09/2012 500
8 111B 13/09/2012 -166
9 111B 13/09/2012 -225

我正在寻找一个查询来给我运行总计,如下所示(运行总计在帐户更改时重置):

P_ID AcctNo 日期 金额 运行总计
1 111A 04/03/2011 -331 -331
2 111A 04/03/2011 600 269
3 111A 04/03/2011 20000 20269
4 111A 05/03/2011 -20000 269
5 111A 10/03/2011 -260 9
6 111B 01/08/2011 2 2
7 111B 12/09/2012 500 502
8 111B 13/09/2012 -166 336
9 111B 13/09/2012 -225 111

4

2 回答 2

4

如果您使用的是 SQL Server 2012,这是一个非常简单的查询:

declare @t table (P_ID int,AcctNo char(4), [Date] date, Amount int)
insert into @t(P_ID,AcctNo,Date,Amount) values
(1,'111A','20110304',-331),
(2,'111A','20110304',600),
(3,'111A','20110304',20000),
(4,'111A','20110305',-20000),
(5,'111A','20110310',-260),
(6,'111B','20110801',2),
(7,'111B','20120912',500),
(8,'111B','20120913',-166),
(9,'111B','20120913',-225)

select *,SUM(Amount) OVER (PARTITION BY AcctNo ORDER BY P_ID
      RANGE UNBOUNDED PRECEDING) from @t order by P_ID

结果:

P_ID        AcctNo Date       Amount      
----------- ------ ---------- ----------- -----------
1           111A   2011-03-04 -331        -331
2           111A   2011-03-04 600         269
3           111A   2011-03-04 20000       20269
4           111A   2011-03-05 -20000      269
5           111A   2011-03-10 -260        9
6           111B   2011-08-01 2           2
7           111B   2012-09-12 500         502
8           111B   2012-09-13 -166        336
9           111B   2012-09-13 -225        111

这使用了 SQL Server 2012 中的新功能,可以在范围内应用聚合函数 - 事实上,RANGE在这种情况下甚至不需要该子句,因为:

如果ROWS/RANGE未指定但ORDER BY已指定,RANGE UNBOUNDED PRECEDING AND CURRENT ROW则用作窗口框架的默认值

但我在这里添加它是为了更清楚地发生了什么。

于 2013-04-04T06:56:27.973 回答
1

试试这个 :-

SELECT P_ID,AcctNo, Amount,
(SELECT SUM(Amount)  as total
    FROM YourTable s 
    WHERE s.P_ID <= a.P_ID and s.AcctNo=a.AcctNo   
 ) AS b
FROM YourTable a

SQLFIDDLE中的演示

结果

╔══════╦════════╦════════╦═══════╗
║ P_ID ║ ACCTNO ║ AMOUNT ║   B   ║
╠══════╬════════╬════════╬═══════╣
║    1 ║ 111A   ║   -331 ║  -331 ║
║    2 ║ 111A   ║    600 ║   269 ║
║    3 ║ 111A   ║  20000 ║ 20269 ║
║    4 ║ 111A   ║ -20000 ║   269 ║
║    5 ║ 111A   ║   -260 ║     9 ║
║    6 ║ 111B   ║      2 ║     2 ║
║    7 ║ 111B   ║    500 ║   502 ║
║    8 ║ 111B   ║   -166 ║   336 ║
║    9 ║ 111B   ║   -225 ║   111 ║
╚══════╩════════╩════════╩═══════╝
于 2013-04-04T06:45:16.017 回答