SQL-код для создания новых строк на основе существующих строк

Недавно мой вопрос дал мне простой способ генерации данных в таком формате:

Date 1.0 2.0 3.0 Completed 2017-01-01 10 10 5 0 2017-02-01 10 10 5 5 2017-03-01 15 10 5 15 2017-04-01 15 10 5 25 

Эти данные представляют данные «выгорания» для Agile-проекта. Это всего лишь данные прошлого, и нам также нужно предсказать будущие данные. Только значения Date и Completed будут изменены в будущем, и они будут увеличиваться на значения в другой таблице, например

 Project Velocity Days Foo 25 14 Bar 35 21 

Мне нужно создать дополнительные строки в 1-й таблице, при этом значения Date и Completed увеличиваются на значения во второй таблице, например:

 Date 1.0 2.0 3.0 Completed 2017-04-15 15 10 5 50 2017-04-29 15 10 5 75 2017-05-13 15 10 5 100 2017-05-28 15 10 5 125 

Пока еще не нужно количество дополнительных строк (как далеко в будущем для прогнозирования), но сейчас я снимаю 10 дополнительных строк.

Поскольку SQL не кажется большим в циклах FOR, как я мог бы сгенерировать эти дополнительные строки и UNION (или что-то еще) с исходными данными?

UPDATE # 1: На основе комментариев я просмотрел таблицу Numbers (что-то еще о SQL, о котором я никогда не слышал!), Создал ее и использовал ее так:

 DECLARE @EndDate date = '20170731' DECLARE @StartDate date = (select top 1 Date from VersionHistory order by Date DESC) DECLARE @StartCompleted int = (select top 1 StoryPoints from VersionHistory where Version='Completed' order by Date DESC) DECLARE @DateIncrement int = (select top 1 Days from Velocities) DECLARE @Velocity int = (select top 1 Velocity from Velocities) SELECT [Date] = DATEADD(DAY, Number * @DateIncrement, @StartDate), [StoryPoints] = @StartCompleted + Number * @Velocity FROM dbo.Numbers WHERE Number <= DATEDIFF(DAY, @StartDate, @EndDate)/@DateIncrement ORDER BY Date; 

Это создало новые «будущие» значения следующим образом:

 Date StoryPoints 2017-04-15 50 2017-04-29 75 2017-05-13 100 2017-05-27 125 2017-06-10 150 2017-06-24 175 2017-07-08 200 2017-07-22 225 

Это почти полностью. Мне все же нужно «повторить» значения из других столбцов в исходной таблице, так что окончательный вывод выглядит следующим образом:

 Date 1.0 2.0 3.0 Completed 2017-04-15 15 10 5 50 2017-04-29 15 10 5 75 2017-05-13 15 10 5 100 2017-05-28 15 10 5 125 ... 

Поскольку мои исходные данные только что поступают из другого оператора (см. Соответствующий вопрос ), как я могу получить эти значения из строки LAST в этих данных и включить в эти новые данные? Помните, что имена столбцов НЕ известны заранее, кроме даты и завершения.

Я предполагаю, что мне придется изменить исходные данные, чтобы сохранить их в таблице temp, чтобы извлечь то, что мне нужно, сохранить эти новые производные данные Numbers в другой таблице temp, а затем UNION их, но я застрял на некоторых из механика этого.

Спасибо за замечательные комментарии. Мне удалось использовать таблицу Numbers, чтобы помочь создать «предсказанные» строки для моей таблицы. Было немного сложно получить значения из последней строки (из исходных данных) определенных столбцов (@columnsVersions) для использования в этом, но вот код для использования этих значений (@versionValues) и заполнения дополнительных строк в таблице:

 DECLARE @StartDate date = (select top 1 Date from VersionHistory where project=@Project and Version='Completed' order by Date DESC) DECLARE @StartCompleted int = (select top 1 StoryPoints from VersionHistory where project=@Project and Version='Completed' order by Date DESC) DECLARE @DateIncrement int = (select top 1 Days from Velocities where project = @Project) DECLARE @Velocity int = (select top 1 Velocity from Velocities where project = @Project) DECLARE @EndDate date = '2017-12-31' set @q=' insert into #T1 (Date, Predicted, ' + @columnsVersions + ') SELECT DATEADD(DAY, Number * ' + CONVERT(varchar(10), @DateIncrement) + ',''' + CONVERT(varchar(10), @StartDate) + ''') ,' + CONVERT(varchar(10), @StartCompleted) + ' + Number * ' + CONVERT(varchar(10), @Velocity) + ' ,' + @versionValues + ' FROM dbo.Numbers WHERE Number <= DATEDIFF(DAY,''' + CONVERT(varchar(10),@StartDate) + ''',''' + CONVERT(varchar(10), @EndDate) + ''')/' + CONVERT(varchar(10),@DateIncrement) exec(@q) select * from #T1