2017-07-19 1 views
1

recent question of mineは私にこのような形式のデータを生成する簡単な方法を与えました。これは過去のデータですが、将来のデータも予測する必要があります。日付のみと完成した値は、将来的に変更されます、そして、彼らは私が日付で第一の表の追加の行、およびによってインクリメント完成した値を生成する必要がSQLコード

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ループには大きくないようですので、これらの追加の行を生成して元のデータと結合するにはどうすればよいですか?

UPDATE#1: コメントに基づいて、私は、(!私は聞いたことがなかったSQLについて何か他のもの)1を作成した番号のテーブルに見て、このようにそれを使用

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を参照してください):最終的な出力は次のようになりますように、私はまだ、元のテーブルの他の列の値を「リピート」する必要がありますそのデータの最後の行からこれらの値を取得し、この新しいデータに含めることはできますか?カラム名は、DateとCompleted以外のカラム名は事前にわかっていないことに注意してください。

オリジナルのデータを変更して必要なものを抽出し、この新しいNumbersテーブルの派生データを別の一時テーブルに保存してから結合する必要があると思いますが、これの仕組みのいくつかについています。

+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