web-dev-qa-db-ja.com

同じフィールドを続けて合計する必要があり、結果はフィールドで累積する必要があります

これは私の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
1
Kbert

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
2

相関サブクエリを使用する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
1
TheGameiswar