我正在使用SQL Server 2014.我的数据库中有一个名为' ReservationStayDate'的表(大约100万条记录)。提取物如下所示:
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及其各自的日期标准。这里的逻辑是ReservationStayDate表WHERE BookingDate中的所有记录都在'之间。 2016年1月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所示)。 每次修改我的T-SQL查询以提取PromoName表中提到的每个PromoNames的数据都非常繁琐。
我希望能够使用ReservationStayDate表加入我的PromoName表,但我对如何连接以及如何编写符合我所需输出的T-SQL逻辑感到困惑。
假设:PromoNames与StayDates之间没有重叠日期。
关于如何实现这一目标的任何想法?
答案 0 :(得分:3)
我认为你可以通过使用LEFT JOIN和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
答案 1 :(得分: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