これは私のSQLServer 2008R2テーブルです。
ID Amount date_time
001 9.00 01/01/2015 01:01:00
001 20.00 01/02/2015 01:02:00
001 20.00 01/02/2015 01:03:00
002 20.00 01/01/2015 01:01:00
002 20.00 01/01/2015 01:02:00
003 20.00 01/02/2015 00:00:00
003 10.00 01/03/2015 00:00:00
003 5.00 01/04/2015 00:00:00
累計(ID順、日付/時刻)でこのようにする必要があります:
ID Amount running amount date/time
001 9.00 9.00 1/1/2015 01:01:00
001 20.00 29.00 1/2/2015 01:02:00
001 20.00 49.00 1/2/2015 01:03:00
002 20.00 20.00 1/1/2015 01:01:00
002 20.00 40.00 1/1/2015 01:02:00
003 20.00 20.00 1/2/2015 00:00:00
003 10.00 30.00 1/3/2015 00:00:00
003 5.00 35.00 1/4/2015 00:00:00
SQL Server 2012以降では、次の境界を持つWINDOW関数を使用できます。
SELECT *
, SUM([Amount]) OVER(PARTITION BY [ID] ORDER BY [date_time] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM @data;
以前のバージョンでは、自己結合を使用できます。
SELECT d1.ID, d1.[date_time], d1.Amount
, SUM(d2.Amount) as running_amount
FROM @data d1
INNER JOIN @data d2 ON d1.ID = d2.ID AND d2.[date_time] <= d1.[date_time]
GROUP BY d1.ID, d1.[date_time], d1.Amount;
出力:
ID | date_time | Amount | running_amount
1 | 2015-01-01 02:01:00.000 | 9 | 9
1 | 2015-01-02 02:02:00.000 | 20 | 29
1 | 2015-01-02 02:03:00.000 | 20 | 49
2 | 2015-01-01 02:01:00.000 | 20 | 20
2 | 2015-01-01 02:02:00.000 | 20 | 40
3 | 2015-01-02 01:00:00.000 | 20 | 20
3 | 2015-01-03 01:00:00.000 | 10 | 30
3 | 2015-01-04 01:00:00.000 | 5 | 35
相関サブクエリを使用する1つのバージョン。
select
id,
amount
(select sum(amount) from test t2 where t1.id=t2.id and t1.datetime<=t2.datetime) as 'Runningamount',
datetime
from test t1
クロスアプライを使用するもの
select
id,amount,b.*,datetime
from test t1
cross apply
(select sum(amount) as 'RA' from test t2 where t1.id=t2.id and t1.datetime<=t2.datetime) b