これには再帰的なCTEを使用する必要があります。
;with c as(
SELECT t1.Order_ID, t1.Order_Type_ID, t1.NAME, t1.Date,
1 As Sequence, t3.Repeat_Number, t3.Repeat_Sequence
FROM #Table1 t1 INNER JOIN #Table3 t3 ON t1.Order_Type_ID = t3.Order_Type_ID
UNION ALL
SELECT c.Order_ID, c.Order_Type_ID, c.NAME, c.Date,
c.Sequence+1 As Sequence, c.Repeat_Number, c.Repeat_Sequence
FROM c WHERE c.Sequence < c.Repeat_Number)
select Order_ID, Order_Type_ID, Name, Sequence
, CASE WHEN Repeat_Sequence LIKE '%W' THEN DATEADD(week, Sequence * CAST(REPLACE(Repeat_Sequence, 'W', '') AS INT), Date)
WHEN Repeat_Sequence LIKE '%M' THEN DATEADD(month, Sequence * CAST(REPLACE(Repeat_Sequence, 'M', '') AS INT), Date) END from c
order by Order_ID, Sequence
結果:
Order_ID Order_Type_ID Name Sequence
----------- ------------- ------ ----------- -----------------------
1 1 Order1 1 2016-03-21 00:00:00.000
1 1 Order1 2 2016-04-04 00:00:00.000
1 1 Order1 3 2016-04-18 00:00:00.000
2 2 Order2 1 2016-03-21 00:00:00.000
2 2 Order2 2 2016-05-21 00:00:00.000
(5 row(s) affected)
あなたが今後の注文を確認したい場合だけにして、今日の日付少ないしすべてのレコードを除外することがSQL Serverであると仮定すると、クエリは次のようになります。
(オラクルであなただけの週の7日間を追加することができ、または数ヶ月のためにADD_MONTHSを使用し、PostgresのではあなたがINTERVALを使用する)このクエリはDATEADD関数の周りに小さな変更でOracleまたはpostgresのために働くことに注意して
ください。
UPDATE:
あなたはイベントの日付に基づいて、注文日を計算する必要がある場合は、このようなクエリにそれに参加することができます。
;with c as(
SELECT t1.Order_ID, t1.Order_Type_ID, t1.NAME, t2.Event_Date,
1 As Sequence, t3.Repeat_Number, t3.Repeat_Sequence
FROM #Table1 t1 INNER JOIN #Table3 t3 ON t1.Order_Type_ID = t3.Order_Type_ID
INNER JOIN #Table2 t2 ON t1.Order_ID = t2.Order_ID
UNION ALL
SELECT c.Order_ID, c.Order_Type_ID, c.NAME, c.Event_Date,
c.Sequence+1 As Sequence, c.Repeat_Number, c.Repeat_Sequence
FROM c WHERE c.Sequence < c.Repeat_Number)
select Order_ID, Order_Type_ID, Name, Sequence
, CASE WHEN Repeat_Sequence LIKE '%W' THEN DATEADD(week, Sequence * CAST(REPLACE(Repeat_Sequence, 'W', '') AS INT), Event_Date)
WHEN Repeat_Sequence LIKE '%M' THEN DATEADD(month, Sequence * CAST(REPLACE(Repeat_Sequence, 'M', '') AS INT), Event_Date) END from c
order by Order_ID, Sequence
データベースを使用していますか? –
あなたの期待される出力には、1つの列「シーケンス」があり、それはTable1、Table2またはTable3のいずれのテーブルにもありません。 Post in Clear cut形式をうまく説明してください。 –
シーケンスは、順序が開始されるn番目の時間を表すインクリメンタルな数値です。たとえば、表2にはorder_ID 1のイベントがあります。つまり、注文は1回送信され、さらに2回、つまり2と3のシーケンスを送信する必要があります。 – user2502961