Logo

SQL Server RunningSUM Function

Updated 2023-11-14 15:40:36

Description

Use the scalar function RunningSUM to calculate the sum of column values in an ordered resultant table, without the need for a self-join. The sum is calculated for each value from the first value to the last value in the ordered group or partition. If the column values are presented to the functions out of order, an error message will be generated.

Syntax

SELECT [westclintech].[wct].[RunningSUM](
  <@Val, float,>
 ,<@Round, int,>
 ,<@RowNum, int,>
 ,<@Id, tinyint,>)

Arguments

@Val

the value passed into the function. @Val is an expression of type float or of a type that can be implicitly converted to float.

@Round

the number of decimals places to store the result. @Round is an expression of type int or of a type that can be implicitly converted to int.

@RowNum

the number of the row within the group for which the sum is being calculated. If @RowNum for the current row in a set is less than or equal to the previous @RowNum and @RowNum is not equal to 1, an error message will be generated. @RowNum is an expression of type int or of a type that can be implicitly converted to int.

@Id

a unique identifier for the RunningSUM calculation. @Id allows you to specify multiple RunningSUM calculation s within a resultant table. @Id is an expression of type tinyint or of a type that can be implicitly converted to tinyint.

Return Type

float

Remarks

If @Id is NULL then @Id = 0.

To calculate moving sums, use the MovingSUM function.

If @RowNum is equal to 1, RunningSUM is equal to @Val

@RowNum must be in ascending order.

There may be cases where the order in which the data are returned to the function and the order in which the results are returned are different, generally due to parallelism. You can use OPTION(MAXDOP 1) or OPTION(MAXDOP 1,FORCE ORDER) to help eliminate this problem.

Examples

In this example we will calculate the running balance for a check book. We will create a temporary table, #c, populate it with some data and then run the SELECT.

--Create the temporary table
CREATE TABLE #c
(
    trn int,
    cust_ref varchar(5),
    date_trn datetime,
    payee varchar(20),
    amt_trn money,
    PRIMARY KEY (trn)
);
--Populate the table with some data
INSERT INTO #c
VALUES
(1, 'DD', '2011-12-23', NULL, 1500);
INSERT INTO #c
VALUES
(2, '1200', '2012-01-01', 'Car Leasing Company', -361.75);
INSERT INTO #c
VALUES
(3, '1201', '2012-01-01', 'Mortgage Bank', -1129.23);
INSERT INTO #c
VALUES
(4, 'DD', '2012-01-08', NULL, 1100);
INSERT INTO #c
VALUES
(5, '1202', '2012-01-15', 'Gas Company', -108.49);
INSERT INTO #c
VALUES
(6, '1203', '2012-01-15', 'Electric Company', -98.27);
INSERT INTO #c
VALUES
(7, '1204', '2012-01-15', 'Telephone Company', -136.6);
INSERT INTO #c
VALUES
(8, 'DD', '2012-02-15', NULL, 1100);
INSERT INTO #c
VALUES
(9, '1205', '2012-02-01', 'Car Leasing Company', -361.75);
INSERT INTO #c
VALUES
(10, '1206', '2012-02-01', 'Mortgage Bank', -1129.23);
INSERT INTO #c
VALUES
(11, 'DD', '2012-02-08', NULL, 1100);
INSERT INTO #c
VALUES
(12, '1207', '2012-02-15', 'Gas Company', -153.89);
INSERT INTO #c
VALUES
(13, '1208', '2012-02-15', 'Electric Company', -121.99);
INSERT INTO #c
VALUES
(14, '1209', '2012-02-15', 'Telephone Company', -138.92);
INSERT INTO #c
VALUES
(15, 'DD', '2012-02-23', NULL, 1100);
INSERT INTO #c
VALUES
(16, '1210', '2012-03-01', 'Car Leasing Company', -361.75);
INSERT INTO #c
VALUES
(17, '1211', '2012-03-01', 'Mortgage Bank', -1129.23);
INSERT INTO #c
VALUES
(18, 'DD', '2012-03-08', NULL, 1100);
INSERT INTO #c
VALUES
(19, '1212', '2012-03-15', 'Gas Company', -70.79);
INSERT INTO #c
VALUES
(20, '1213', '2012-03-15', 'Electric Company', -93.57);
INSERT INTO #c
VALUES
(21, '1214', '2012-03-15', 'Telephone Company', -149.78);
INSERT INTO #c
VALUES
(22, 'DD', '2012-03-23', NULL, 1100);
INSERT INTO #c
VALUES
(23, '1215', '2012-04-01', 'Car Leasing Company', -361.75);
INSERT INTO #c
VALUES
(24, '1216', '2012-04-01', 'Mortgage Bank', -1129.23);
INSERT INTO #c
VALUES
(25, 'DD', '2012-04-08', NULL, 1100);
INSERT INTO #c
VALUES
(26, '1217', '2012-04-15', 'Gas Company', -105.58);
INSERT INTO #c
VALUES
(27, '1218', '2012-04-15', 'Electric Company', -149.36);
INSERT INTO #c
VALUES
(28, '1219', '2012-04-15', 'Telephone Company', -145.35);
INSERT INTO #c
VALUES
(29, 'DD', '2012-04-23', NULL, 1100);
INSERT INTO #c
VALUES
(30, '1220', '2012-05-01', 'Car Leasing Company', -361.75);
INSERT INTO #c
VALUES
(31, '1221', '2012-05-01', 'Mortgage Bank', -1129.23);
INSERT INTO #c
VALUES
(32, 'DD', '2012-05-08', NULL, 1100);
INSERT INTO #c
VALUES
(33, '1222', '2012-05-15', 'Gas Company', -96.27);
INSERT INTO #c
VALUES
(34, '1223', '2012-05-15', 'Electric Company', -114.62);
INSERT INTO #c
VALUES
(35, '1224', '2012-05-15', 'Telephone Company', -145.43);
INSERT INTO #c
VALUES
(36, 'DD', '2012-05-23', NULL, 1100);
INSERT INTO #c
VALUES
(37, '1225', '2012-06-01', 'Car Leasing Company', -361.75);
INSERT INTO #c
VALUES
(38, '1226', '2012-06-01', 'Mortgage Bank', -1129.23);
INSERT INTO #c
VALUES
(39, 'DD', '2012-06-08', NULL, 1100);
INSERT INTO #c
VALUES
(40, '1227', '2012-06-15', 'Gas Company', -147.03);
INSERT INTO #c
VALUES
(41, '1228', '2012-06-15', 'Electric Company', -130.52);
INSERT INTO #c
VALUES
(42, '1229', '2012-06-15', 'Telephone Company', -147.71);
INSERT INTO #c
VALUES
(43, 'DD', '2012-06-23', NULL, 1100);
INSERT INTO #c
VALUES
(44, '1230', '2012-07-01', 'Car Leasing Company', -361.75);
INSERT INTO #c
VALUES
(45, '1231', '2012-07-01', 'Mortgage Bank', -1129.23);
INSERT INTO #c
VALUES
(46, 'DD', '2012-07-08', NULL, 1100);
--Calculate the running total
SELECT cast(convert(varchar, date_trn, 106) as char(11)) as date_trn,
       cust_ref,
       payee,
       amt_trn,
       wct.RunningSUM(amt_trn, 2, trn, NULL) as [Running Total]
FROM #c;
--Clean up
DROP TABLE #c;

This produces the following result.

date_trncust_refpayeeamt_trnRunning Total
23 Dec 2011DDNULL1500.001500
01 Jan 20121200Car Leasing Company-361.751138.25
01 Jan 20121201Mortgage Bank-1129.239.02
08 Jan 2012DDNULL1100.001109.02
15 Jan 20121202Gas Company-108.491000.53
15 Jan 20121203Electric Company-98.27902.26
15 Jan 20121204Telephone Company-136.60765.66
15 Feb 2012DDNULL1100.001865.66
01 Feb 20121205Car Leasing Company-361.751503.91
01 Feb 20121206Mortgage Bank-1129.23374.68
08 Feb 2012DDNULL1100.001474.68
15 Feb 20121207Gas Company-153.891320.79
15 Feb 20121208Electric Company-121.991198.8
15 Feb 20121209Telephone Company-138.921059.88
23 Feb 2012DDNULL1100.002159.88
01 Mar 20121210Car Leasing Company-361.751798.13
01 Mar 20121211Mortgage Bank-1129.23668.9
08 Mar 2012DDNULL1100.001768.9
15 Mar 20121212Gas Company-70.791698.11
15 Mar 20121213Electric Company-93.571604.54
15 Mar 20121214Telephone Company-149.781454.76
23 Mar 2012DDNULL1100.002554.76
01 Apr 20121215Car Leasing Company-361.752193.01
01 Apr 20121216Mortgage Bank-1129.231063.78
08 Apr 2012DDNULL1100.002163.78
15 Apr 20121217Gas Company-105.582058.2
15 Apr 20121218Electric Company-149.361908.84
15 Apr 20121219Telephone Company-145.351763.49
23 Apr 2012DDNULL1100.002863.49
01 May 20121220Car Leasing Company-361.752501.74
01 May 20121221Mortgage Bank-1129.231372.51
08 May 2012DDNULL1100.002472.51
15 May 20121222Gas Company-96.272376.24
15 May 20121223Electric Company-114.622261.62
15 May 20121224Telephone Company-145.432116.19
23 May 2012DDNULL1100.003216.19
01 Jun 20121225Car Leasing Company-361.752854.44
01 Jun 20121226Mortgage Bank-1129.231725.21
08 Jun 2012DDNULL1100.002825.21
15 Jun 20121227Gas Company-147.032678.18
15 Jun 20121228Electric Company-130.522547.66
15 Jun 20121229Telephone Company-147.712399.95
23 Jun 2012DDNULL1100.003499.95
01 Jul 20121230Car Leasing Company-361.753138.2
01 Jul 20121231Mortgage Bank-1129.232008.97
08 Jul 2012DDNULL1100.003108.97

In this example, we calculate the running total and the running total for each month and use the ROW_NUMBER() function to determine the @RowNum value passed into the RunningSUM function.

SELECT cast(convert(varchar, date_trn, 106) as char(11)) as date_trn,
       cust_ref,
       payee,
       amt_trn,
       wct.RunningSUM(amt_trn, 2, ROW_NUMBER() OVER (PARTITION by MONTH(date_trn)
                 ORDER BY trn), 1) as [MTD Total],
       wct.RunningSUM(amt_trn, 2, trn, NULL) as [YTD Total]
FROM #c
ORDER BY trn;

This produces the following result.

date_trncust_refpayeeamt_trnMTD TotalYTD Total
23 Dec 2011DDNULL1500.001500.001500.00
01 Jan 20121200Car Leasing Company-361.75-361.751138.25
01 Jan 20121201Mortgage Bank-1129.23-1490.989.02
08 Jan 2012DDNULL1100.00-390.981109.02
15 Jan 20121202Gas Company-108.49-499.471000.53
15 Jan 20121203Electric Company-98.27-597.74902.26
15 Jan 20121204Telephone Company-136.60-734.34765.66
15 Feb 2012DDNULL1100.001100.001865.66
01 Feb 20121205Car Leasing Company-361.75738.251503.91
01 Feb 20121206Mortgage Bank-1129.23-390.98374.68
08 Feb 2012DDNULL1100.00709.021474.68
15 Feb 20121207Gas Company-153.89555.131320.79
15 Feb 20121208Electric Company-121.99433.141198.80
15 Feb 20121209Telephone Company-138.92294.221059.88
23 Feb 2012DDNULL1100.001394.222159.88
01 Mar 20121210Car Leasing Company-361.75-361.751798.13
01 Mar 20121211Mortgage Bank-1129.23-1490.98668.90
08 Mar 2012DDNULL1100.00-390.981768.90
15 Mar 20121212Gas Company-70.79-461.771698.11
15 Mar 20121213Electric Company-93.57-555.341604.54
15 Mar 20121214Telephone Company-149.78-705.121454.76
23 Mar 2012DDNULL1100.00394.882554.76
01 Apr 20121215Car Leasing Company-361.75-361.752193.01
01 Apr 20121216Mortgage Bank-1129.23-1490.981063.78
08 Apr 2012DDNULL1100.00-390.982163.78
15 Apr 20121217Gas Company-105.58-496.562058.20
15 Apr 20121218Electric Company-149.36-645.921908.84
15 Apr 20121219Telephone Company-145.35-791.271763.49
23 Apr 2012DDNULL1100.00308.732863.49
01 May 20121220Car Leasing Company-361.75-361.752501.74
01 May 20121221Mortgage Bank-1129.23-1490.981372.51
08 May 2012DDNULL1100.00-390.982472.51
15 May 20121222Gas Company-96.27-487.252376.24
15 May 20121223Electric Company-114.62-601.872261.62
15 May 20121224Telephone Company-145.43-747.302116.19
23 May 2012DDNULL1100.00352.703216.19
01 Jun 20121225Car Leasing Company-361.75-361.752854.44
01 Jun 20121226Mortgage Bank-1129.23-1490.981725.21
08 Jun 2012DDNULL1100.00-390.982825.21
15 Jun 20121227Gas Company-147.03-538.012678.18
15 Jun 20121228Electric Company-130.52-668.532547.66
15 Jun 20121229Telephone Company-147.71-816.242399.95
23 Jun 2012DDNULL1100.00283.763499.95
01 Jul 20121230Car Leasing Company-361.75-361.753138.20
01 Jul 20121231Mortgage Bank-1129.23-1490.982008.97
08 Jul 2012DDNULL1100.00-390.983108.97