2013-06-24 6 views
1

Je l'instruction SQL suivante qui retourne 2 lignes (jours de réservation)lignes de fusion sur instruction SQL

SELECT bd.ID, t.FirstName, t.Surname, 
CASE WHEN bd.BookingDuration = 3 AND CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 THEN bd.ID ELSE NULL END as 'TuesdayHourlyAM', 
CASE WHEN bd.BookingDuration = 3 AND CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 THEN bd.ID ELSE NULL END as 'TuesdayHourlyAM2' 
from BookingDays bd join 
(
    select ID, MIN(StartTime) as minx, MAX(StartTime) as maxx 
    from BookingDays 
    where BookingDate = CONVERT(date, '18/06/2013', 103) and BookingType = 0 
    group by ID 
) 
tmin 
on bd.ID = tmin.ID and bd.StartTime = tmin.minx 

inner join Teachers t on bd.TeacherID = t.ID 
where t.Surname = 'cairns' 
group by bd.ID, bd.StartTime, bd.DayText, t.Firstname, t.Surname, bd.BookingDate,  bd.BookingDuration, bd.NoOfHours, tmin.minx, tmin.maxx 

Ce retour -

Screenshot of 2 rows that need merging in to one

Ce que je cherche est une table avec un format similaire, toutefois en 1 ligne:

Prénom | Nom | MardiHourlyAM1 | TuesdayHourlyAM1Start | MardiHourlyAM1End | MardiHourlyAM2 | TuesdayHourlyAM2Start | TuesdayHourlyAM2End

TuesdayHourlyAM1: BookingDayID TuesdayHourlyAM2: BookingDayID Début/Fin: début et fin des temps pour les réservations

Où AM1 est la plus petite heure de début et AM2 est la plus grande heure de départ (il n'y aura jamais plus que 2 jours de réservation pour ce critère).

Répondre

1
SELECT t.FirstName, t.Surname, tmin.id as TuesdayHourlyAM1, tmin.StartTime as TuesdayHourlyAM1Start, tmin.Endtime as TuesdayHourlyAM1End , 
tmax.id as TuesdayHourlyAM2, tmax.StartTime as TuesdayHourlyAM2Start, tmax.Endtime as TuesdayHourlyAM2End 
Teachers t inner join 
from 
(
    select top 1 id, bd.teacherID MIN(StartTime) as StartTime, endtime as Endtime 
    from BookingDays bd inner join Teachers t on bd.TeacherID = t.ID 
    where BookingDate = CONVERT(date, '18/06/2013', 103) and BookingType = 0 and t.Surname = 'cairns' 
    group by id,endtime, bd.teacherID 
     order by StartTime asc 
) 
tmin 
on t.id = tmin.teacherID 
join 
(
    select top 1 id, bd.teacherID, max(StartTime) as StartTime, endtime as Endtime 
    from BookingDays bd inner join Teachers t on bd.TeacherID = t.ID 
    where BookingDate = CONVERT(date, '18/06/2013', 103) and BookingType = 0 and t.Surname = 'cairns' 
    group by id,endtime, bd.teacherID 
    order by StartTime desc 

) 
tmax 
on t.id = tmax.teacherID 
+0

Je peux voir où vous allez avec ceci et cela devrait fonctionner, cependant 0 lignes sont retournées. Lorsque j'enlève le top 1 des deux jointures, j'obtiens 2 rangées de données, mais la rangée du haut montre la première réservation deux fois, alors la deuxième rangée montre la deuxième réservation deux fois. Merci – dynamicuser

+0

bien sûr, désolé, essayez la dernière! – JamieA

+0

J'adore! Merci – dynamicuser

1

Essayez de regrouper votre sous-requête par teacherid plutôt que bookingid

SELECT t.FirstName, t.Surname, minx as TuesdayHourlyAM1, maxx as TuesdayHourlyAM2 
from BookingDays bd join 
(
    select TeacherID, MIN(StartTime) as minx, MAX(StartTime) as maxx 
    from BookingDays 
    where BookingDate = CONVERT(date, '18/06/2013', 103) and BookingType = 0 
    group by TeacherID 
) 
tmin 
on bd.teacherID = tmin.ID and bd.StartTime = tmin.minx 

inner join Teachers t on bd.TeacherID = t.ID 
where t.Surname = 'cairns' 
+0

Cela fonctionne à un point. Il supprime la deuxième ligne, mais les valeurs AM et AM2 sont les mêmes BookingDayID. En outre, j'essaie d'afficher le BookingDayID dans les 2 instructions CASE, donc quand je retire l'ID du groupe, je ne peux pas afficher l'ID? Cheers – dynamicuser

+0

J'ai édité ma réponse pour satisfaire le format que vous avez spécifié, ie Prénom | Nom | MardiHourlyAM1 | TuesdayHourlyAM2, la réservationDayId ne devrait pas avoir d'importance, à moins que vous ne vouliez aussi que ce champ soit retourné dans votre SELECT – JamieA

+0

Merci pour cela. Je m'excuse, j'ai édité ma question pour clarifier ce que la sortie doit être. – dynamicuser