Logo

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_trncust_refpayeeamt_trnRunning Total
23 Dec 2011DDNULL1500.001
01 Jan 20121200Car Leasing Company-361.752
01 Jan 20121201Mortgage Bank-1129.233
08 Jan 2012DDNULL1100.004
15 Jan 20121202Gas Company-108.495
15 Jan 20121203Electric Company-98.276
15 Jan 20121204Telephone Company-136.607
15 Feb 2012DDNULL1100.008
01 Feb 20121205Car Leasing Company-361.759
01 Feb 20121206Mortgage Bank-1129.2310
08 Feb 2012DDNULL1100.0011
15 Feb 20121207Gas Company-153.8912
15 Feb 20121208Electric Company-121.9913
15 Feb 20121209Telephone Company-138.9214
23 Feb 2012DDNULL1100.0015
01 Mar 20121210Car Leasing Company-361.7516
01 Mar 20121211Mortgage Bank-1129.2317
08 Mar 2012DDNULL1100.0018
15 Mar 20121212Gas Company-70.7919
15 Mar 20121213Electric Company-93.5720
15 Mar 20121214Telephone Company-149.7821
23 Mar 2012DDNULL1100.0022
01 Apr 20121215Car Leasing Company-361.7523
01 Apr 20121216Mortgage Bank-1129.2324
08 Apr 2012DDNULL1100.0025
15 Apr 20121217Gas Company-105.5826
15 Apr 20121218Electric Company-149.3627
15 Apr 20121219Telephone Company-145.3528
23 Apr 2012DDNULL1100.0029
01 May 20121220Car Leasing Company-361.7530
01 May 20121221Mortgage Bank-1129.2331
08 May 2012DDNULL1100.0032
15 May 20121222Gas Company-96.2733
15 May 20121223Electric Company-114.6234
15 May 20121224Telephone Company-145.4335
23 May 2012DDNULL1100.0036
01 Jun 20121225Car Leasing Company-361.7537
01 Jun 20121226Mortgage Bank-1129.2338
08 Jun 2012DDNULL1100.0039
15 Jun 20121227Gas Company-147.0340
15 Jun 20121228Electric Company-130.5241
15 Jun 20121229Telephone Company-147.7142
23 Jun 2012DDNULL1100.0043
01 Jul 20121230Car Leasing Company-361.7544
01 Jul 20121231Mortgage Bank-1129.2345
08 Jul 2012DDNULL1100.0046

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_trncust_refpayeeamt_trnMTD CountRunning Count
23 Dec 2011DDNULL1500.0011
01 Jan 20121200Car Leasing Company-361.7512
01 Jan 20121201Mortgage Bank-1129.2323
08 Jan 2012DDNULL1100.0034
15 Jan 20121202Gas Company-108.4945
15 Jan 20121203Electric Company-98.2756
15 Jan 20121204Telephone Company-136.6067
15 Feb 2012DDNULL1100.0018
01 Feb 20121205Car Leasing Company-361.7529
01 Feb 20121206Mortgage Bank-1129.23310
08 Feb 2012DDNULL1100.00411
15 Feb 20121207Gas Company-153.89512
15 Feb 20121208Electric Company-121.99613
15 Feb 20121209Telephone Company-138.92714
23 Feb 2012DDNULL1100.00815
01 Mar 20121210Car Leasing Company-361.75116
01 Mar 20121211Mortgage Bank-1129.23217
08 Mar 2012DDNULL1100.00318
15 Mar 20121212Gas Company-70.79419
15 Mar 20121213Electric Company-93.57520
15 Mar 20121214Telephone Company-149.78621
23 Mar 2012DDNULL1100.00722
01 Apr 20121215Car Leasing Company-361.75123
01 Apr 20121216Mortgage Bank-1129.23224
08 Apr 2012DDNULL1100.00325
15 Apr 20121217Gas Company-105.58426
15 Apr 20121218Electric Company-149.36527
15 Apr 20121219Telephone Company-145.35628
23 Apr 2012DDNULL1100.00729
01 May 20121220Car Leasing Company-361.75130
01 May 20121221Mortgage Bank-1129.23231
08 May 2012DDNULL1100.00332
15 May 20121222Gas Company-96.27433
15 May 20121223Electric Company-114.62534
15 May 20121224Telephone Company-145.43635
23 May 2012DDNULL1100.00736
01 Jun 20121225Car Leasing Company-361.75137
01 Jun 20121226Mortgage Bank-1129.23238
08 Jun 2012DDNULL1100.00339
15 Jun 20121227Gas Company-147.03440
15 Jun 20121228Electric Company-130.52541
15 Jun 20121229Telephone Company-147.71642
23 Jun 2012DDNULL1100.00743
01 Jul 20121230Car Leasing Company-361.75144
01 Jul 20121231Mortgage Bank-1129.23245
08 Jul 2012DDNULL1100.00346

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_trncust_refpayeeamt_trnMTD CountRunning Count
23 Dec 2011DDNULL1500.0000
01 Jan 20121200Car Leasing Company-361.7511
01 Jan 20121201Mortgage Bank-1129.2322
08 Jan 2012DDNULL1100.0022
15 Jan 20121202Gas Company-108.4933
15 Jan 20121203Electric Company-98.2744
15 Jan 20121204Telephone Company-136.6055
15 Feb 2012DDNULL1100.0005
01 Feb 20121205Car Leasing Company-361.7516
01 Feb 20121206Mortgage Bank-1129.2327
08 Feb 2012DDNULL1100.0027
15 Feb 20121207Gas Company-153.8938
15 Feb 20121208Electric Company-121.9949
15 Feb 20121209Telephone Company-138.92510
23 Feb 2012DDNULL1100.00510
01 Mar 20121210Car Leasing Company-361.75111
01 Mar 20121211Mortgage Bank-1129.23212
08 Mar 2012DDNULL1100.00212
15 Mar 20121212Gas Company-70.79313
15 Mar 20121213Electric Company-93.57414
15 Mar 20121214Telephone Company-149.78515
23 Mar 2012DDNULL1100.00515
01 Apr 20121215Car Leasing Company-361.75116
01 Apr 20121216Mortgage Bank-1129.23217
08 Apr 2012DDNULL1100.00217
15 Apr 20121217Gas Company-105.58318
15 Apr 20121218Electric Company-149.36419
15 Apr 20121219Telephone Company-145.35520
23 Apr 2012DDNULL1100.00520
01 May 20121220Car Leasing Company-361.75121
01 May 20121221Mortgage Bank-1129.23222
08 May 2012DDNULL1100.00222
15 May 20121222Gas Company-96.27323
15 May 20121223Electric Company-114.62424
15 May 20121224Telephone Company-145.43525
23 May 2012DDNULL1100.00525
01 Jun 20121225Car Leasing Company-361.75126
01 Jun 20121226Mortgage Bank-1129.23227
08 Jun 2012DDNULL1100.00227
15 Jun 20121227Gas Company-147.03328
15 Jun 20121228Electric Company-130.52429
15 Jun 20121229Telephone Company-147.71530
23 Jun 2012DDNULL1100.00530
01 Jul 20121230Car Leasing Company-361.75131
01 Jul 20121231Mortgage Bank-1129.23232
08 Jul 2012DDNULL1100.00232