Try the following query
DML:
CREATE TABLE [dbo].[ATMONTH](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[Month] [varchar](50) NULL,
[COUNT OF CUSTOMER] [varchar] (50) NULL,
[RefMonthStart] [varchar](50) NULL,
[RefMonthEnd] [varchar](50) NULL)
INSERT INTO [dbo].[ATMONTH]([Month])
VALUES ('Jan'),
('Feb'),
('Mar'),
('Apr'),
('May'),
('Jun'),
('Jul'),
('Aug'),
('Sep'),
('Oct'),
('Nov'),
('Dec');
CREATE TABLE dbo.MonthsAndDays
(
[Month] VARCHAR(3),
Days SMALLINT
)
INSERT INTO dbo.MonthsAndDays([Month],Days)
VALUES ('Jan',31),
('Feb',28),
('Mar',31),
('Apr',30),
('May',31),
('Jun',30),
('Jul',31),
('Aug',31),
('Sep',31),
('Oct',30),
('Nov',30),
('Dec',31);
Query:
DECLARE @refmonthstart INT = 0
;WITH CTE AS
(
SELECT a.ID,
a.Month,
a.[COUNT OF CUSTOMER],
a.[RefMonthStart],
a.[RefMonthEnd],
b.Days Days,
ROW_NUMBER() OVER ( ORDER BY a.[ID] ASC) i
FROM [dbo].[ATMONTH] a
INNER JOIN dbo.MonthsAndDays b
ON a.[Month] = b.[Month]
)
,
ResultSet AS
(
SELECT ID,
Month,
[COUNT OF CUSTOMER],
@refmonthstart AS RefMonthStart,
Days + @refmonthstart AS RefMonthEnd,
i
FROM CTE
WHERE i = 1
UNION ALL
SELECT T.ID,
T.Month,
T.[COUNT OF CUSTOMER],
R.RefMonthEnd + 1,
T.Days + R.RefMonthEnd,
T.i
FROM ResultSet R
INNER JOIN CTE T
ON R.i + 1 = T.i
)
SELECT *
FROM ResultSet
OPTION (MAXRECURSION 1000)
Query will recursively calculate refmonthstart and refmonthend value. Set the MAXRECURSION value depending upon the number of rows you have in the table.
You can set the initial refmonthstart value where @refmonthstart is declared, I have set it to 0(zero)