2016-12-01 4 views
2

私はSQL Server 2014を使用しています。私のデータベースには、「ReservationStayDate」というテーブル(約100万レコード)があります。以下に抽出物を示す:T-SQLクエリで日付についてこのロジックを渡すには?

ResaID StayDate  BookingDate 
253  2016-02-10 2016-01-15 
253  2016-02-11 2016-01-15 
253  2016-02-12 2016-01-15 
321  2016-05-03 2016-02-21 
321  2016-05-04 2016-02-21 

...リストが続きます。 は、私は(Excelファイル内のテーブルである)以下の基準に基づいてReservationStayDateテーブルからデータを抽出する必要があります。

PromoName BookingDateStart BookingDateEnd StayDateStart StayDateEnd 
Promo1  2016-01-10  2016-01-30  2016-02-08  2016-02-15 
Promo2  2016-03-04  2016-04-30  2016-06-01  2016-06-14 
Promo3  2016-03-06  2016-04-20  2016-06-20  2016-06-27 

...と、リストには約100 PromoNamesと、それぞれの日付のcriteriasにに行きます。ここでのロジックは、ReservationStayDateテーブルWHERE BookingDateのすべてのレコードが '2016-01-10'と '2016-01-30'の間にあり、StayDateが '2016-02-08'と '2016-02-15'の間にあることです「Promo1」とタグ付けされます。

このExcelファイルを元の形式でSQL Serverデータベースのテーブル(PromoName)にエクスポートしました。

次のように私が探しています出力は次のようになりますように

ResaID MinStayDate MaxStayDate BookingDate PromoName 
253  2016-02-10 2016-02-12 2016-01-15  Promo1 
321  2016-05-03 2016-05-04 2016-02-21  NULL 

を...と。 ResaIDがPrmoNameテーブルの各PromoNameに記載されている基準に該当しない場合、そのResaIDの出力はT-SQL出力の​​PromoName列の下にNULLを表示します(前述のResaID 321を参照)。 PromoNameテーブルに記載されている各PromoNamesのデータを抽出するたびに、自分のT-SQLクエリを変更するのは本当に面倒です。

私はReservationStayDateテーブルで私のPromoNameテーブルをジョインできるようにしたいと思いますが、私はどのようにジョインしていますか、また、私の希望する出力を満たすT-SQLロジックを書く方法について固執しています。

前提条件:PromoNamesとStayDatesの間に重複する日付はありません。

これを達成するためのアイデアはありますか?

答えて

3

私はあなたがJOINをLEFTを使用すると、GROUP BYによってこれを実現することができると思う:

create table #ReservationStayDate(ResaID int, StayDate date,  BookingDate date) 

insert into #ReservationStayDate values 
(253,  '2016-02-10', '2016-01-15'), 
(253,  '2016-02-11', '2016-01-15'), 
(253,  '2016-02-12', '2016-01-15'), 
(321,  '2016-05-03', '2016-02-21'), 
(321,  '2016-05-04', '2016-02-21') 

create table #PromoName(
    PromoName varchar(50), 
    BookingDateStart date, 
    BookingDateEnd date, 
    StayDateStart date, 
    StayDateEnd date) 

insert into #PromoName values 
('Promo1','2016-01-10','2016-01-30','2016-02-08','2016-02-15') 

select a.ResaID, 
    min(a.StayDate) MinStayDate, 
    max(a.StayDate) MaxStayDate, 
    a.BookingDate BookingDate, 
    b.PromoName 
from #ReservationStayDate a 
left join #PromoName b on a.BookingDate 
            between b.BookingDateStart and b.BookingDateEnd 
and a.StayDate between b.StayDateStart and b.StayDateEnd 
group by a.ResaID, a.BookingDate, b.PromoName 
+0

それが動作するはずですか、すべて私たちは何かが間違っていた場合は、同様にその要件に対処するための簡単な変更を行うことができます。ありがとう – Susang

+0

これは良い見えます、私はOPが最初にすべての情報を与えて欲しいです。 –

+0

@Surazあなたの解決に感謝します。私はそれを試して、それがどうなるか見てみましょう。 – user3115933

0
SELECT ResaID,MIN(StayDate) MINStayDate,MAX(StayDate) 
MAXStayDate,BookingDate,A.PromoName 
FROM ReservationStayDate 
LEFT OUTER JOIN 
(
    SELECT PromoName,BookingDateStart,BookingDateEnd 
    FROM PromoName 
)A ON BookingDate BETWEEN BookingDateStart AND BookingDateEnd 
GROUP BY ResaID,BookingDate,PromoName 
関連する問題