--We need two tables, one for actual, one for forecast records
DECLARE @ActualRecords TABLE (
[FiscalYear] INT,
[Month] NUMERIC(2,0),
[Type] VARCHAR(10),
[Value] NUMERIC(19,0));
DECLARE @ForecastRecords TABLE (
[FiscalYear] INT,
[Month] NUMERIC(2,0),
[Type] VARCHAR(10),
[Value] NUMERIC(19,0));
INSERT INTO @ForecastRecords VALUES ('2022', 12,'forecast',120);
INSERT INTO @ForecastRecords VALUES ('2023', 1,'forecast',110);
INSERT INTO @ForecastRecords VALUES ('2023', 2,'forecast',100);
INSERT INTO @ForecastRecords VALUES ('2023', 3,'forecast',90);
INSERT INTO @ForecastRecords VALUES ('2023', 4,'forecast',80);
INSERT INTO @ForecastRecords VALUES ('2023', 5,'forecast',70);
INSERT INTO @ForecastRecords VALUES ('2023', 6,'forecast',70);
INSERT INTO @ForecastRecords VALUES ('2023', 7,'forecast',60);
INSERT INTO @ForecastRecords VALUES ('2023', 8,'forecast',50);
INSERT INTO @ForecastRecords VALUES ('2023', 9,'forecast',40);
INSERT INTO @ForecastRecords VALUES ('2023', 10,'forecast',80);
INSERT INTO @ForecastRecords VALUES ('2023', 11,'forecast',70);
INSERT INTO @ForecastRecords VALUES ('2023', 12,'forecast',60);
INSERT INTO @ForecastRecords VALUES ('2024', 1,'forecast',50);
INSERT INTO @ForecastRecords VALUES ('2024', 2,'forecast',40);
INSERT INTO @ForecastRecords VALUES ('2024', 3,'forecast',90);
INSERT INTO @ForecastRecords VALUES ('2024', 4,'forecast',80);
INSERT INTO @ForecastRecords VALUES ('2024', 5,'forecast',80);
INSERT INTO @ForecastRecords VALUES ('2024', 6,'forecast',70);
INSERT INTO @ForecastRecords VALUES ('2024', 7,'forecast',60);
INSERT INTO @ForecastRecords VALUES ('2024', 8,'forecast',50);
INSERT INTO @ForecastRecords VALUES ('2024', 9,'forecast',40);
INSERT INTO @ForecastRecords VALUES ('2024', 10,'forecast',80);
INSERT INTO @ForecastRecords VALUES ('2024', 11,'forecast',70);
INSERT INTO @ForecastRecords VALUES ('2024', 12,'forecast',60);
INSERT INTO @ActualRecords VALUES ('2022', 12,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 1,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 2,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 3,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 4,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 5,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 6,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 7,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 8,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 9,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 10,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 11,'actual',0);
INSERT INTO @ActualRecords VALUES ('2023', 12,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 1,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 2,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 3,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 4,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 5,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 6,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 7,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 8,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 9,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 10,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 11,'actual',0);
INSERT INTO @ActualRecords VALUES ('2024', 12,'actual',0);
--we have inserted dummy values above
DECLARE @currentMonth INT = CAST(MONTH(GETDATE()) AS INT);
DECLARE @currentYear INT = CAST(YEAR(GETDATE()) AS INT);
--we create variables to capture date part
WITH firstStage ([FiscalYear],[Month],[Type],[Value])
AS
(
SELECT * FROM @ActualRecords
WHERE FiscalYear < @currentYear OR (FiscalYear = @currentYear AND Month <= @currentMonth)
UNION
SELECT * FROM @ForecastRecords
WHERE FiscalYear > @currentYear OR (FiscalYear = @currentYear AND Month > @currentMonth)
)
SELECT *
INTO ##TEMP
FROM firstStage;
--SELECT * FROM firstStage;
SELECT * FROM
(
SELECT * FROM ##TEMP
) t
WITH secondStage AS (
SELECT *,
CASE WHEN Month = 12 THEN [Value] END AS 'December',
CASE WHEN Month = 1 THEN [Value] END AS 'January',
CASE WHEN Month = 2 THEN [Value] END AS 'February',
CASE WHEN Month = 3 THEN [Value] END AS 'March',
CASE WHEN Month = 4 THEN [Value] END AS 'April',
CASE WHEN Month = 5 THEN [Value] END AS 'May',
CASE WHEN Month = 6 THEN [Value] END AS 'June',
CASE WHEN Month = 7 THEN [Value] END AS 'July',
CASE WHEN Month = 8 THEN [Value] END AS 'August',
CASE WHEN Month = 9 THEN [Value] END AS 'September',
CASE WHEN Month = 10 THEN [Value] END AS 'October',
CASE WHEN Month = 11 THEN [Value] END AS 'November'
FROM ##TEMP
)
SELECT * INTO ##TEMP1
FROM secondStage
SELECT * FROM ##TEMP1
WITH thirdStage AS (
SELECT
[FiscalYear],
SUM([January]) as [Jan], SUM([February]) as [Feb], SUM([March]) as [Mar], SUM([April]) as [Apr],
SUM([May]) as [May], SUM([June]) as [Jun], SUM([July]) as [Jul], SUM([August]) as [Aug],
SUM([September]) as [Sep], SUM([October]) as [Oct], SUM([November]) as [Nov], SUM([December]) as [Dec]
FROM ##TEMP1
GROUP BY [FiscalYear]
) SELECT * INTO ##TEMP2
FROM thirdStage
--DROP TABLE IF EXISTS ##TEMP2
SELECT * FROM ##TEMP2
WITH finalStage AS (
SELECT
[FiscalYear],
COALESCE([Jan], 0) as [Jan],
COALESCE([Feb], 0) as [Feb],
COALESCE([Mar], 0) as [Mar],
COALESCE([Apr], 0) as [Apr],
COALESCE([May], 0) as [May],
COALESCE([Jun], 0) as [Jun],
COALESCE([Jul], 0) as [Jul],
COALESCE([Aug], 0) as [Aug],
COALESCE([Sep], 0) as [Sep],
COALESCE([Oct], 0) as [Oct],
COALESCE([Nov], 0) as [Nov],
COALESCE([Dec], 0) as [Dec]
FROM ##TEMP2
) SELECT * FROM finalStage
--in the end we can see actuals till currentmont and year
--and we can see projections for future date