2012-03-23 12 views
1

のは、私は、次の表があるとしましょう(SQL Serverなど)

にtableA

seq datea 
1 2010-01-01 
2 2010-02-01 
3 2010-03-01 

TableBの

私が欲しい
dateb  sthvalue 
2010-01-11 AAA 
2010-01-12 AAB 
2010-02-03 CCC 
2010-02-06 CCD 
2010-02-10 CCE 
2010-03-05 FFF 

tableb.datebの2つのテーブルに参加するのは、のdaterangeの範囲内です10

すなわち出力は、あなたの種類の助けを

seq datea  dateb  sthvalue 
1 2010-01-01 2010-01-11 AAA 
1 2010-01-01 2010-01-12 AAB 
2 2010-02-01 2010-02-03 CCC 
2 2010-02-01 2010-02-06 CCD 
2 2010-02-01 2010-02-10 CCE 
3 2010-03-01 2010-03-05 FFF 

感謝しなければなりません!

+0

あなたはああ、日付が毎月のように保証されていないなど – JeffO

答えて

1

が離れて常に1カ月で、1日に設定することができますあなたは年と月

select 
     seq,datea,dateb,sthvalue 
from 
     TableA inner join Tableb 
     on datepart(year,datea) = datepart(year,dateb) and 
     datepart(month,datea) = datepart(month,dateb) 
     order by seq,dateb 
+0

お返事ありがとうございました!しかし、私は、テーブルAは月間のステートメントであり、テーブルBはステートメントトランザクションであるため、seqテーブルAのテーブルに参加しなければなりません。私はそれをどうすればいいのかを試してみよう。もう一度あなたの助けに感謝します! – AlphaAu

1

私はあなたがその表Aの値を仮定し

select 
    a.seq, 
    a.datea, 
    b.dateb, 
    b.sthvalue 
from 
    tablea a inner join tableb b on (b.dateb >= a.datea and b.dateb < dateadd(month, 1, a.datea)) 
order by 
    a.seq, b.sthvalue 
+0

、今年、あなたは同月、「範囲」によって何を意味するか指定する必要があります。誤解を招くような例を掲載しました – AlphaAu

0

に参加するためにされて求めているものを信じています毎月、既存の回答が行います。

場合はより多くの多様性を含むことができ、あなたのテーブルA:

これは、一緒に2つのテーブルを結合し、その後現在に一致するものよりも発生TABLEAから「より良い」参加(行を見つけようと
SELECT 
    * 
FROM 
    TableB b 
     inner join 
    TableA a 
     on 
      b.dateb >= a.datea 
     left join 
    TableA a_nolater 
     on 
      a_nolater.datea > a.datea and 
      b.dateb >= a_nolater.datea 
WHERE 
    a_nolater.seq is null 

、それでもなおテーブルbと一致するだろう)。この「より良い」結合が見つからない行だけを返します。そのため、tableBの日付の前または最前にある最新の日付のある行がtableAにあります。

+0

ああ、日付は毎月であることを保証するものではありません。私は誤解を招く例を掲載しています。 – AlphaAu

関連する問題