SQL Server RunningCOUNT Function
Updated 2023-11-14 14:32:04.087000
Description
Use the scalar function to show how many rows are included in an ordered resultant table or within a partition in the resultant table, without having to do a self-join. The count is calculated over all the values 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].[RunningCOUNT](
<@Val, sql_variant,>
,<@RowNum, int,>
,<@Id, tinyint,>
,<@CountNulls, bit,>)
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.
@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 RunningCOUNT calculation. @Id allows you to specify multiple RunningCOUNT calculation s within a resultant table. @Id is an expression of type tinyint or of a type that can be implicitly converted to tinyint.
@CountNulls
Indicates whether NULL values are included in the count. Enter 'True' to count NULL or 'False' not to count NULL. @CountNulls is an expression of type bit or of a type that can be implicitly converted to bit.
Return Type
float
Remarks
If @Id is NULL then @Id = 0.
To calculate moving count, use the MovingCOUNT function.
@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 count of items 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 COUNT
SELECT cast(convert(varchar, date_trn, 106) as char(11)) as date_trn,
cust_ref,
payee,
amt_trn,
wct.RunningCOUNT(amt_trn, trn, NULL, NULL) as [Running Count]
FROM #c;
--Clean up
DROP TABLE #c;
This produces the following result.
| date_trn | cust_ref | payee | amt_trn | Running Total |
|---|---|---|---|---|
| 23 Dec 2011 | DD | NULL | 1500.00 | 1 |
| 01 Jan 2012 | 1200 | Car Leasing Company | -361.75 | 2 |
| 01 Jan 2012 | 1201 | Mortgage Bank | -1129.23 | 3 |
| 08 Jan 2012 | DD | NULL | 1100.00 | 4 |
| 15 Jan 2012 | 1202 | Gas Company | -108.49 | 5 |
| 15 Jan 2012 | 1203 | Electric Company | -98.27 | 6 |
| 15 Jan 2012 | 1204 | Telephone Company | -136.60 | 7 |
| 15 Feb 2012 | DD | NULL | 1100.00 | 8 |
| 01 Feb 2012 | 1205 | Car Leasing Company | -361.75 | 9 |
| 01 Feb 2012 | 1206 | Mortgage Bank | -1129.23 | 10 |
| 08 Feb 2012 | DD | NULL | 1100.00 | 11 |
| 15 Feb 2012 | 1207 | Gas Company | -153.89 | 12 |
| 15 Feb 2012 | 1208 | Electric Company | -121.99 | 13 |
| 15 Feb 2012 | 1209 | Telephone Company | -138.92 | 14 |
| 23 Feb 2012 | DD | NULL | 1100.00 | 15 |
| 01 Mar 2012 | 1210 | Car Leasing Company | -361.75 | 16 |
| 01 Mar 2012 | 1211 | Mortgage Bank | -1129.23 | 17 |
| 08 Mar 2012 | DD | NULL | 1100.00 | 18 |
| 15 Mar 2012 | 1212 | Gas Company | -70.79 | 19 |
| 15 Mar 2012 | 1213 | Electric Company | -93.57 | 20 |
| 15 Mar 2012 | 1214 | Telephone Company | -149.78 | 21 |
| 23 Mar 2012 | DD | NULL | 1100.00 | 22 |
| 01 Apr 2012 | 1215 | Car Leasing Company | -361.75 | 23 |
| 01 Apr 2012 | 1216 | Mortgage Bank | -1129.23 | 24 |
| 08 Apr 2012 | DD | NULL | 1100.00 | 25 |
| 15 Apr 2012 | 1217 | Gas Company | -105.58 | 26 |
| 15 Apr 2012 | 1218 | Electric Company | -149.36 | 27 |
| 15 Apr 2012 | 1219 | Telephone Company | -145.35 | 28 |
| 23 Apr 2012 | DD | NULL | 1100.00 | 29 |
| 01 May 2012 | 1220 | Car Leasing Company | -361.75 | 30 |
| 01 May 2012 | 1221 | Mortgage Bank | -1129.23 | 31 |
| 08 May 2012 | DD | NULL | 1100.00 | 32 |
| 15 May 2012 | 1222 | Gas Company | -96.27 | 33 |
| 15 May 2012 | 1223 | Electric Company | -114.62 | 34 |
| 15 May 2012 | 1224 | Telephone Company | -145.43 | 35 |
| 23 May 2012 | DD | NULL | 1100.00 | 36 |
| 01 Jun 2012 | 1225 | Car Leasing Company | -361.75 | 37 |
| 01 Jun 2012 | 1226 | Mortgage Bank | -1129.23 | 38 |
| 08 Jun 2012 | DD | NULL | 1100.00 | 39 |
| 15 Jun 2012 | 1227 | Gas Company | -147.03 | 40 |
| 15 Jun 2012 | 1228 | Electric Company | -130.52 | 41 |
| 15 Jun 2012 | 1229 | Telephone Company | -147.71 | 42 |
| 23 Jun 2012 | DD | NULL | 1100.00 | 43 |
| 01 Jul 2012 | 1230 | Car Leasing Company | -361.75 | 44 |
| 01 Jul 2012 | 1231 | Mortgage Bank | -1129.23 | 45 |
| 08 Jul 2012 | DD | NULL | 1100.00 | 46 |
In this example, we calculate the running count and the running count for each month and use the ROW_NUMBER() function to determine the @RowNum value passed into the RunningCOUNT function.
SELECT cast(convert(varchar, date_trn, 106) as char(11)) as date_trn,
cust_ref,
payee,
amt_trn,
wct.RunningCOUNT(amt_trn, ROW_NUMBER() OVER (PARTITION by MONTH(date_trn)
ORDER BY trn), 1, NULL) as [MTD Count],
wct.RunningCOUNT(amt_trn, trn, NULL, NULL) as [Running Count]
FROM #c
ORDER BY trn;
This produces the following result.
| date_trn | cust_ref | payee | amt_trn | MTD Count | Running Count |
|---|---|---|---|---|---|
| 23 Dec 2011 | DD | NULL | 1500.00 | 1 | 1 |
| 01 Jan 2012 | 1200 | Car Leasing Company | -361.75 | 1 | 2 |
| 01 Jan 2012 | 1201 | Mortgage Bank | -1129.23 | 2 | 3 |
| 08 Jan 2012 | DD | NULL | 1100.00 | 3 | 4 |
| 15 Jan 2012 | 1202 | Gas Company | -108.49 | 4 | 5 |
| 15 Jan 2012 | 1203 | Electric Company | -98.27 | 5 | 6 |
| 15 Jan 2012 | 1204 | Telephone Company | -136.60 | 6 | 7 |
| 15 Feb 2012 | DD | NULL | 1100.00 | 1 | 8 |
| 01 Feb 2012 | 1205 | Car Leasing Company | -361.75 | 2 | 9 |
| 01 Feb 2012 | 1206 | Mortgage Bank | -1129.23 | 3 | 10 |
| 08 Feb 2012 | DD | NULL | 1100.00 | 4 | 11 |
| 15 Feb 2012 | 1207 | Gas Company | -153.89 | 5 | 12 |
| 15 Feb 2012 | 1208 | Electric Company | -121.99 | 6 | 13 |
| 15 Feb 2012 | 1209 | Telephone Company | -138.92 | 7 | 14 |
| 23 Feb 2012 | DD | NULL | 1100.00 | 8 | 15 |
| 01 Mar 2012 | 1210 | Car Leasing Company | -361.75 | 1 | 16 |
| 01 Mar 2012 | 1211 | Mortgage Bank | -1129.23 | 2 | 17 |
| 08 Mar 2012 | DD | NULL | 1100.00 | 3 | 18 |
| 15 Mar 2012 | 1212 | Gas Company | -70.79 | 4 | 19 |
| 15 Mar 2012 | 1213 | Electric Company | -93.57 | 5 | 20 |
| 15 Mar 2012 | 1214 | Telephone Company | -149.78 | 6 | 21 |
| 23 Mar 2012 | DD | NULL | 1100.00 | 7 | 22 |
| 01 Apr 2012 | 1215 | Car Leasing Company | -361.75 | 1 | 23 |
| 01 Apr 2012 | 1216 | Mortgage Bank | -1129.23 | 2 | 24 |
| 08 Apr 2012 | DD | NULL | 1100.00 | 3 | 25 |
| 15 Apr 2012 | 1217 | Gas Company | -105.58 | 4 | 26 |
| 15 Apr 2012 | 1218 | Electric Company | -149.36 | 5 | 27 |
| 15 Apr 2012 | 1219 | Telephone Company | -145.35 | 6 | 28 |
| 23 Apr 2012 | DD | NULL | 1100.00 | 7 | 29 |
| 01 May 2012 | 1220 | Car Leasing Company | -361.75 | 1 | 30 |
| 01 May 2012 | 1221 | Mortgage Bank | -1129.23 | 2 | 31 |
| 08 May 2012 | DD | NULL | 1100.00 | 3 | 32 |
| 15 May 2012 | 1222 | Gas Company | -96.27 | 4 | 33 |
| 15 May 2012 | 1223 | Electric Company | -114.62 | 5 | 34 |
| 15 May 2012 | 1224 | Telephone Company | -145.43 | 6 | 35 |
| 23 May 2012 | DD | NULL | 1100.00 | 7 | 36 |
| 01 Jun 2012 | 1225 | Car Leasing Company | -361.75 | 1 | 37 |
| 01 Jun 2012 | 1226 | Mortgage Bank | -1129.23 | 2 | 38 |
| 08 Jun 2012 | DD | NULL | 1100.00 | 3 | 39 |
| 15 Jun 2012 | 1227 | Gas Company | -147.03 | 4 | 40 |
| 15 Jun 2012 | 1228 | Electric Company | -130.52 | 5 | 41 |
| 15 Jun 2012 | 1229 | Telephone Company | -147.71 | 6 | 42 |
| 23 Jun 2012 | DD | NULL | 1100.00 | 7 | 43 |
| 01 Jul 2012 | 1230 | Car Leasing Company | -361.75 | 1 | 44 |
| 01 Jul 2012 | 1231 | Mortgage Bank | -1129.23 | 2 | 45 |
| 08 Jul 2012 | DD | NULL | 1100.00 | 3 | 46 |
In this Example we use a CASE statement and set @CountNulls to 'False' in order to count just the debits.
SELECT cast(convert(varchar, date_trn, 106) as char(11)) as date_trn,
cust_ref,
payee,
amt_trn,
wct.RunningCOUNT( CASE
WHEN amt_trn > 0 THEN
NULL
ELSE
amt_trn
END,
ROW_NUMBER() OVER (PARTITION by MONTH(date_trn)ORDER
BY trn),
1,
'False'
) as [MTD Count],
wct.RunningCOUNT( CASE
WHEN amt_trn > 0 THEN
NULL
ELSE
amt_trn
END,
trn,
NULL,
'False'
) as [Running Count]
FROM #c
ORDER BY trn;
This produces the following result.
| date_trn | cust_ref | payee | amt_trn | MTD Count | Running Count |
|---|---|---|---|---|---|
| 23 Dec 2011 | DD | NULL | 1500.00 | 0 | 0 |
| 01 Jan 2012 | 1200 | Car Leasing Company | -361.75 | 1 | 1 |
| 01 Jan 2012 | 1201 | Mortgage Bank | -1129.23 | 2 | 2 |
| 08 Jan 2012 | DD | NULL | 1100.00 | 2 | 2 |
| 15 Jan 2012 | 1202 | Gas Company | -108.49 | 3 | 3 |
| 15 Jan 2012 | 1203 | Electric Company | -98.27 | 4 | 4 |
| 15 Jan 2012 | 1204 | Telephone Company | -136.60 | 5 | 5 |
| 15 Feb 2012 | DD | NULL | 1100.00 | 0 | 5 |
| 01 Feb 2012 | 1205 | Car Leasing Company | -361.75 | 1 | 6 |
| 01 Feb 2012 | 1206 | Mortgage Bank | -1129.23 | 2 | 7 |
| 08 Feb 2012 | DD | NULL | 1100.00 | 2 | 7 |
| 15 Feb 2012 | 1207 | Gas Company | -153.89 | 3 | 8 |
| 15 Feb 2012 | 1208 | Electric Company | -121.99 | 4 | 9 |
| 15 Feb 2012 | 1209 | Telephone Company | -138.92 | 5 | 10 |
| 23 Feb 2012 | DD | NULL | 1100.00 | 5 | 10 |
| 01 Mar 2012 | 1210 | Car Leasing Company | -361.75 | 1 | 11 |
| 01 Mar 2012 | 1211 | Mortgage Bank | -1129.23 | 2 | 12 |
| 08 Mar 2012 | DD | NULL | 1100.00 | 2 | 12 |
| 15 Mar 2012 | 1212 | Gas Company | -70.79 | 3 | 13 |
| 15 Mar 2012 | 1213 | Electric Company | -93.57 | 4 | 14 |
| 15 Mar 2012 | 1214 | Telephone Company | -149.78 | 5 | 15 |
| 23 Mar 2012 | DD | NULL | 1100.00 | 5 | 15 |
| 01 Apr 2012 | 1215 | Car Leasing Company | -361.75 | 1 | 16 |
| 01 Apr 2012 | 1216 | Mortgage Bank | -1129.23 | 2 | 17 |
| 08 Apr 2012 | DD | NULL | 1100.00 | 2 | 17 |
| 15 Apr 2012 | 1217 | Gas Company | -105.58 | 3 | 18 |
| 15 Apr 2012 | 1218 | Electric Company | -149.36 | 4 | 19 |
| 15 Apr 2012 | 1219 | Telephone Company | -145.35 | 5 | 20 |
| 23 Apr 2012 | DD | NULL | 1100.00 | 5 | 20 |
| 01 May 2012 | 1220 | Car Leasing Company | -361.75 | 1 | 21 |
| 01 May 2012 | 1221 | Mortgage Bank | -1129.23 | 2 | 22 |
| 08 May 2012 | DD | NULL | 1100.00 | 2 | 22 |
| 15 May 2012 | 1222 | Gas Company | -96.27 | 3 | 23 |
| 15 May 2012 | 1223 | Electric Company | -114.62 | 4 | 24 |
| 15 May 2012 | 1224 | Telephone Company | -145.43 | 5 | 25 |
| 23 May 2012 | DD | NULL | 1100.00 | 5 | 25 |
| 01 Jun 2012 | 1225 | Car Leasing Company | -361.75 | 1 | 26 |
| 01 Jun 2012 | 1226 | Mortgage Bank | -1129.23 | 2 | 27 |
| 08 Jun 2012 | DD | NULL | 1100.00 | 2 | 27 |
| 15 Jun 2012 | 1227 | Gas Company | -147.03 | 3 | 28 |
| 15 Jun 2012 | 1228 | Electric Company | -130.52 | 4 | 29 |
| 15 Jun 2012 | 1229 | Telephone Company | -147.71 | 5 | 30 |
| 23 Jun 2012 | DD | NULL | 1100.00 | 5 | 30 |
| 01 Jul 2012 | 1230 | Car Leasing Company | -361.75 | 1 | 31 |
| 01 Jul 2012 | 1231 | Mortgage Bank | -1129.23 | 2 | 32 |
| 08 Jul 2012 | DD | NULL | 1100.00 | 2 | 32 |