2016-03-22 18 views
2

表1:3つのテーブルを結合してクエリを書く方法?

Order_ID Order_Type_ID NAME  Date  
    1   1   Order1 03-07-16 
    2   2   Order2 01-21-16 

表2:

ID Order_ID Event_Date 
1   1  03-21-16 
2   2  03-21-16 

表3:

ID Order_Type_ID Repeat_Number Repeat_Sequence 
1   1    3     2W 
2   2    2     2M 

Iは、3つのテーブルの上に接合することにより、クエリを記述する必要があります。表1には、そのタイプと日付のオーダーのリストがあります。表2は、注文が送信された場合、主にイベントを格納します。表3には、注文を送信する必要がある回数とその間隔を示す注文タイプの相互参照があります。例:type_Id 1の注文は、注文の開始日から2週間ごとに3回送信する必要があります。同様に、type_Id 2の注文は、注文の開始日から2ヶ月ごとに2回送信する必要があります。

イベントテーブル(表2)に基づいて、注文を送信する必要がある回数と次回の送信予定日を計算するクエリを作成する必要があります。例えば

、私が書く必要があるクエリのようなものが表示されるはずです:私は、サブクエリを使用してそれを書くことができますが、他のスマートかつ迅速なアプローチがあるかどうかを知りたい

Order_ID  Sequence  NAME  Date  
    1   2  Order1 04-04-16 
    1   3  Order1 04-18-16 
    2   2  Order2 07-21-16 

を。

ありがとうございました。

+0

データベースを使用していますか? –

+0

あなたの期待される出力には、1つの列「シーケンス」があり、それはTable1、Table2またはTable3のいずれのテーブルにもありません。 Post in Clear cut形式をうまく説明してください。 –

+0

シーケンスは、順序が開始されるn番目の時間を表すインクリメンタルな数値です。たとえば、表2にはorder_ID 1のイベントがあります。つまり、注文は1回送信され、さらに2回、つまり2と3のシーケンスを送信する必要があります。 – user2502961

答えて

0

これには再帰的な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 
+0

回答をいただきありがとうございます。しかし、表2の事象に基づいて次の注文データを決定して計算することは可能ですか?なぜなら、表3のRepeat_Sequenceを変更すると、出力が変わるからです。したがって、表2のイベントに基づいて、注文の送信回数を計算し、次の送信日を表2のEvent_Dateから計算する必要があります。わかりません。 – user2502961

+0

確かです。更新された回答を確認する – cha

関連する問題