The guys from the SQL Server Radio podcast posted a blog post from their episode on calculating running totals in SQL Server. Their script (link in the post) covers several different ways to calculate a running total in a query (A total of a value in the current row added to each row that came before it). The best method (in my view) is using the SUM function with the OVER clause. A lot of the other methods involved a cursor or some other messy method.
I imagine most developers familiar with T-SQL have used the OVER clause with ROW_NUMBER or some other windowing function, but the OVER clause can also be used with aggregate functions, like COUNT or SUM or AVG.
An example:
create table [dbo].[RunningTotal]( RecordId int identity(1,1) NOT NULL, GroupId tinyint NOT NULL, Amount decimal(6, 2) NOT NULL ); insert into [dbo].[RunningTotal](GroupId, Amount) values (1, 12.34); insert into [dbo].[RunningTotal](GroupId, Amount) values (1, 56.78); insert into [dbo].[RunningTotal](GroupId, Amount) values (1, 55.66); insert into [dbo].[RunningTotal](GroupId, Amount) values (2, 33.33); insert into [dbo].[RunningTotal](GroupId, Amount) values (2, 22.10); insert into [dbo].[RunningTotal](GroupId, Amount) values (2, 12.34); insert into [dbo].[RunningTotal](GroupId, Amount) values (3, 98.76); select GroupId, Amount, sum(Amount) over(order by RecordId) as RunningSum, sum(Amount) over(partition by GroupId order by RecordId) as RunningSumByGroup from dbo.RunningTotal; go
This example gives a running total over the whole dataset, plus a running total by Group (GroupId).