2 votes

Comment transmettre cette logique sur les dates dans ma requête T-SQL ?

J'utilise SQL Server 2014. J'ai une table (environ 1 million d'enregistrements) dans ma base de données appelée 'ReservationStayDate'. Un extrait est présenté ci-dessous :

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

...et la liste est longue. J'ai besoin d'extraire des données du tableau ReservationStayDate sur la base des critères ci-dessous (qui est un tableau dans un fichier Excel) :

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

...et la liste continue avec environ 100 noms de promotion et leurs critères de date respectifs. La logique ici est que tous les enregistrements dans la table ReservationStayDate WHERE BookingDate est entre ' 2016-01-10' et '2016-01-30' AND StayDate est entre '2016-02-08' et '2016-02-15' seront marqués comme 'Promo1'.

J'ai exporté ce fichier Excel dans son format original vers une table (appelée PromoName) dans ma base de données SQL Server.

Le résultat que je recherche est le suivant :

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

...et ainsi de suite. Si un ResaID ne correspond pas aux critères mentionnés pour chaque PromoName dans la table PrmoName, alors la sortie pour ce ResaID montrera un NULL sous la colonne PromoName de la sortie T-SQL (comme indiqué pour le ResaID 321 ci-dessus). Il devient vraiment fastidieux de modifier ma requête T-SQL à chaque fois pour extraire des données pour chacun des PromoNames mentionnés dans le tableau PromoName.

J'aimerais pouvoir JOINDRE ma table PromoName à la table ReservationStayDate, mais je suis bloqué quant à la façon d'effectuer la jointure et aussi quant à la façon d'écrire la logique T-SQL qui permettra d'obtenir le résultat souhaité.

Hypothèse : il n'y a pas de chevauchement de dates entre les PromoNames et les StayDates.

Avez-vous des idées sur la façon d'y parvenir ?

3voto

Susang Points 4568

Je pense que vous pouvez y parvenir en utilisant LEFT JOIN et 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

0voto

Mansoor Points 3058
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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X