2017-07-19 78 views
1

一个recent question of mine新行给了我这样的格式生成数据的简单方法: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 

这数据代表的是“燃耗”数据的敏捷项目。但这只是过去的数据,我们也需要预测未来的数据。只有日期和完成值将改变未来,他们将通过值在另一个表中增加,如

Project Velocity Days 
Foo  25  14 
Bar  35  21 

我需要生成在第一表其他行,日期和通过递增完成值在第二个表中的值, 这样的:

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循环中似乎并不大,我怎么能用原始数据生成这些额外的行和联合它们(或别的东西)?

更新#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 
... 

因为我原来的数据只是从另一个语句来(见related question),如何我可以从那些数据中的最后一行获取这些值并包含在这些新数据中吗?请记住,除了“日期”和“已完成”之外,列名不会事先知道。

我假设我必须更改我的原始数据以将其存储在临时表中以提取我需要的内容,将这个新的Numbers-Table派生的数据存储在另一个临时表中,然后UNION它们,但是我卡住了这个的一些机制。

+1

我在tsql中使用递归CTE来处理这类事情 –

+2

您可以使用一个计数(数字)表。我不完全了解您的示例数据和期望的结果之间的联系,所以我不会发布答案,而是查看加入数字表格的选项。 –

+0

这些数据集之间的关系是什么? – scsimon

回答

0

感谢您的好评。我能够使用Numbers表来帮助为我的表创建“预测”行。从某些列(@columnsVersions)的最后一行(@columnsVersions)中获取值是有点难以使用,但下面是使用这些值(@versionValues)并在表中填充其他行的代码:

DECLARE @StartDate date = (select top 1 Date from VersionHistory where [email protected] and Version='Completed' order by Date DESC) 
DECLARE @StartCompleted int = (select top 1 StoryPoints from VersionHistory where [email protected] 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