用于根据现有行

时间:2017-07-19 15:22:13

标签: sql sql-server for-loop union

recent question of mine给了我一种以这样的格式生成数据的简单方法:

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

该数据代表"燃耗"敏捷项目的数据。这只是过去的数据,我们也需要预测未来的数据。只有Date和Completed值将来会改变,它们将按另一个表中的值递增,如

Project  Velocity  Days
Foo      25        14
Bar      35        21

我需要在第一个表中生成其他行,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它们(或其他东西)呢?

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

这产生了新的未来&#34;像这样的价值观:

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

这一直是几乎。我仍然需要重复&#34;来自原始表中其他列的值,以便最终输出如下所示:

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),我如何从该数据的最后一行中获取这些值并包含在这些新数据中?请记住,除了Date和Completed之外,事先不知道列名。

我假设我必须更改我的原始数据以将其存储在临时表中以提取我需要的内容,将这些新的Numbers-table派生数据存储在另一个临时表中,然后UNION它们,但是我&# 39;我坚持使用其中的一些机制。

1 个答案:

答案 0 :(得分:0)

感谢您的好评。我能够使用Numbers表来帮助创建&#34;预测&#34;我的桌子的行。获取某些列(@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