MovingSUM
Updated 2023-11-13 21:50:51.663000
Syntax
SELECT [westclintech].[wct].[MovingSUM](
<@Val, float,>
,<@Round, int,>
,<@Offset, int,>
,<@RowNum, int,>
,<@Id, tinyint,>)
Description
Use the scalar function MovingSUM to calculate the sum of column values in an ordered resultant table, without the need for a self-join. The correlation coefficient is calculated for each value from the first value in the window to the last value in the window. If the column values are presented to the functions out of order, an error message will be generated.
Arguments
@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.
@Id
a unique identifier for the MovingSUM calculation. @Id allows you to specify multiple MovingSUM calculation s within a resultant table. @Id is an expression of type tinyint or of a type that can be implicitly converted to tinyint.
@Offset
specifies the window size. @Offset is an expression of type int or of a type that can be implicitly converted to int.
@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.
Return Type
float
Remarks
If @Id is NULL then @Id = 0.
To calculate a running sum from the beginning of a dataset or partition, use the RunningSUM function.
If @RowNum is equal to 1, MovingSUM 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 moving balance for a check book comprising the 4 preceding rows and the current row. We will create a temporary table, #c, populate it with some data and then run the SELECT.
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.MovingSUM(amt_trn, 2, 4, trn, NULL) as [Moving Total]
FROM #c;
--Clean up
DROP TABLE #c;
This produces the following result.
{"columns":[{"field":"date_trn","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"},{"field":"cust_ref"},{"field":"payee"},{"field":"amt_trn","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"},{"field":"Moving Total","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"}],"rows":[{"date_trn":"23 Dec 2011","cust_ref":"DD","payee":"NULL","amt_trn":"1500.00","Moving Total":"1500"},{"date_trn":"01 Jan 2012","cust_ref":"1200","payee":"Car Leasing Company","amt_trn":"-361.75","Moving Total":"1138.25"},{"date_trn":"01 Jan 2012","cust_ref":"1201","payee":"Mortgage Bank","amt_trn":"-1129.23","Moving Total":"9.02"},{"date_trn":"08 Jan 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"1109.02"},{"date_trn":"15 Jan 2012","cust_ref":"1202","payee":"Gas Company","amt_trn":"-108.49","Moving Total":"1000.53"},{"date_trn":"15 Jan 2012","cust_ref":"1203","payee":"Electric Company","amt_trn":"-98.27","Moving Total":"-597.74"},{"date_trn":"15 Jan 2012","cust_ref":"1204","payee":"Telephone Company","amt_trn":"-136.60","Moving Total":"-372.59"},{"date_trn":"15 Feb 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"1856.64"},{"date_trn":"01 Feb 2012","cust_ref":"1205","payee":"Car Leasing Company","amt_trn":"-361.75","Moving Total":"394.89"},{"date_trn":"01 Feb 2012","cust_ref":"1206","payee":"Mortgage Bank","amt_trn":"-1129.23","Moving Total":"-625.85"},{"date_trn":"08 Feb 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"572.42"},{"date_trn":"15 Feb 2012","cust_ref":"1207","payee":"Gas Company","amt_trn":"-153.89","Moving Total":"555.13"},{"date_trn":"15 Feb 2012","cust_ref":"1208","payee":"Electric Company","amt_trn":"-121.99","Moving Total":"-666.86"},{"date_trn":"15 Feb 2012","cust_ref":"1209","payee":"Telephone Company","amt_trn":"-138.92","Moving Total":"-444.03"},{"date_trn":"23 Feb 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"1785.2"},{"date_trn":"01 Mar 2012","cust_ref":"1210","payee":"Car Leasing Company","amt_trn":"-361.75","Moving Total":"323.45"},{"date_trn":"01 Mar 2012","cust_ref":"1211","payee":"Mortgage Bank","amt_trn":"-1129.23","Moving Total":"-651.89"},{"date_trn":"08 Mar 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"570.1"},{"date_trn":"15 Mar 2012","cust_ref":"1212","payee":"Gas Company","amt_trn":"-70.79","Moving Total":"638.23"},{"date_trn":"15 Mar 2012","cust_ref":"1213","payee":"Electric Company","amt_trn":"-93.57","Moving Total":"-555.34"},{"date_trn":"15 Mar 2012","cust_ref":"1214","payee":"Telephone Company","amt_trn":"-149.78","Moving Total":"-343.37"},{"date_trn":"23 Mar 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"1885.86"},{"date_trn":"01 Apr 2012","cust_ref":"1215","payee":"Car Leasing Company","amt_trn":"-361.75","Moving Total":"424.11"},{"date_trn":"01 Apr 2012","cust_ref":"1216","payee":"Mortgage Bank","amt_trn":"-1129.23","Moving Total":"-634.33"},{"date_trn":"08 Apr 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"559.24"},{"date_trn":"15 Apr 2012","cust_ref":"1217","payee":"Gas Company","amt_trn":"-105.58","Moving Total":"603.44"},{"date_trn":"15 Apr 2012","cust_ref":"1218","payee":"Electric Company","amt_trn":"-149.36","Moving Total":"-645.92"},{"date_trn":"15 Apr 2012","cust_ref":"1219","payee":"Telephone Company","amt_trn":"-145.35","Moving Total":"-429.52"},{"date_trn":"23 Apr 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"1799.71"},{"date_trn":"01 May 2012","cust_ref":"1220","payee":"Car Leasing Company","amt_trn":"-361.75","Moving Total":"337.96"},{"date_trn":"01 May 2012","cust_ref":"1221","payee":"Mortgage Bank","amt_trn":"-1129.23","Moving Total":"-685.69"},{"date_trn":"08 May 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"563.67"},{"date_trn":"15 May 2012","cust_ref":"1222","payee":"Gas Company","amt_trn":"-96.27","Moving Total":"612.75"},{"date_trn":"15 May 2012","cust_ref":"1223","payee":"Electric Company","amt_trn":"-114.62","Moving Total":"-601.87"},{"date_trn":"15 May 2012","cust_ref":"1224","payee":"Telephone Company","amt_trn":"-145.43","Moving Total":"-385.55"},{"date_trn":"23 May 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"1843.68"},{"date_trn":"01 Jun 2012","cust_ref":"1225","payee":"Car Leasing Company","amt_trn":"-361.75","Moving Total":"381.93"},{"date_trn":"01 Jun 2012","cust_ref":"1226","payee":"Mortgage Bank","amt_trn":"-1129.23","Moving Total":"-651.03"},{"date_trn":"08 Jun 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"563.59"},{"date_trn":"15 Jun 2012","cust_ref":"1227","payee":"Gas Company","amt_trn":"-147.03","Moving Total":"561.99"},{"date_trn":"15 Jun 2012","cust_ref":"1228","payee":"Electric Company","amt_trn":"-130.52","Moving Total":"-668.53"},{"date_trn":"15 Jun 2012","cust_ref":"1229","payee":"Telephone Company","amt_trn":"-147.71","Moving Total":"-454.49"},{"date_trn":"23 Jun 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"1774.74"},{"date_trn":"01 Jul 2012","cust_ref":"1230","payee":"Car Leasing Company","amt_trn":"-361.75","Moving Total":"312.99"},{"date_trn":"01 Jul 2012","cust_ref":"1231","payee":"Mortgage Bank","amt_trn":"-1129.23","Moving Total":"-669.21"},{"date_trn":"08 Jul 2012","cust_ref":"DD","payee":"NULL","amt_trn":"1100.00","Moving Total":"561.31"}]}