[英]Alternative to MIN to select more than one row
下面的SQL查询应该显示教师的可用性。 有3种可能的预订类型-AM,PM或全天。 如果有AM预订,则单元格中的文本应显示PM,如果有PM预订,则应显示AM,如果有全天预订,或者AM和PM预订都应显示“ xxx”。
当有1 AM,1 PM或1全天预订时,这一切都很好,但是如果同一天有1 AM和1 PM,则不会显示XXX,因为我正在使用MIN()。 我如何才能在一天之内而不是最小的一天来评估所有预订? (您可以看到我试图在代码的星期四部分显示我的意思。
SQL:
with CTE_D as
(
SELECT
DATEADD(ww, DATEDIFF(ww,0,GETDATE()), 0) as BookingDate
UNION ALL
SELECT
DATEADD(day, 1, BookingDate)
FROM
CTE_D
WHERE
BookingDate < DATEADD(ww, DATEDIFF(ww,0,GETDATE()), 6)
)
SELECT
t.ID, t.Firstname,
t.Surname, tb.Band, t.Telephone, t.Mobile, t.Teacher, t.TeacherAssistant, t.PrimarySchool, t.SecondarySchool,
MIN(CASE WHEN bd.DayText = 'Monday' AND bd.BookingDuration = 0 THEN 'PM' ELSE 'Full Day' END) "Monday",
MIN(CASE WHEN bd.DayText = 'Tuesday' AND bd.BookingDuration = 0 THEN 'PM' ELSE 'Full Day' END) "Tuesday",
MIN(CASE WHEN bd.DayText = 'Wednesday' AND bd.BookingDuration = 0 THEN 'PM' ELSE 'Full Day' END) "Wednesday",
MIN(CASE WHEN bd.DayText = 'Thursday' AND bd.BookingDuration = 0 THEN 'PM' WHEN bd.DayText = 'Thursday' AND bd.BookingDuration = 1 THEN 'AM' WHEN bd.DayText = 'Thursday' AND bd.BookingDuration = 2 or (bd.BookingDuration = 1 and bd.BookingDuration = 0) THEN 'xxx' END) "Thursday",
MIN(CASE WHEN bd.DayText = 'Friday' AND bd.BookingDuration = 0 THEN 'PM' ELSE 'Full Day' END) "Friday",
Notes
FROM Teachers t
cross join CTE_D d
left join BookingDays bd
on t.ID = bd.TeacherID and
bd.BookingDate = d.BookingDate
left join BookingDurations bds
on bd.BookingDuration = bds.ID
left join TeacherBands tb on t.Band = tb.ID
WHERE t.Active = 0 and (t.Status = 0 or t.Status = 1) and (bd.Status = 0 or bd.Status IS NULL) and PrimarySchool = 1
GROUP BY Firstname, Surname, t.Telephone, t.Mobile, t.Notes, tb.Band, t.ID, t.Teacher, t.TeacherAssistant, t.PrimarySchool, t.SecondarySchool, t.Nursery, t.Reception, t.Year1, t.Year2, t.Year3, t.Year4, t.Year5, t.Year6, t.Year7, t.Year8, t.Year9, t.Year10, t.Year11, t.ALevel
ORDER BY Surname, Firstname ASC
表格栏:
ID | Firstname | Surname | Band | Telephone | Mobile | Teacher | Teacher Assistant | PrimarySchool | SecondarySchool | KeyStage | Mon | Tues | Wed | Thurs | Fri | Notes
谢谢,马特
我认为问题在于您正在尝试同时执行两个需要分开的操作(请检查工作日,并检查预订持续时间)。 为此,我假设您的预订时长为:
如果这不正确,则需要调整我的查询范围,但这应该可以使您走上正确的道路。 我还假设预订表中没有记录意味着不可用:
SET LANGUAGE British;
WITH Bookings AS
( SELECT BookingDays.TeacherID,
[WeekDay] = DATENAME(WEEKDAY, BookingDate),
[Status] = CASE WHEN BookingDuration = 0 THEN 'PM' WHEN BookingDuration = 1 THEN 'AM' ELSE 'Full Day' END
FROM BookingDays
), PivotedBookings AS
( SELECT *
FROM Bookings
PIVOT
( MAX([Status])
FOR [WeekDay] IN ([Monday], [Tuesday], [Wednesday], [Thursday], [Friday])
) pvt
)
SELECT t.ID,
t.Firstname,
t.Surname,
tb.Band,
t.Telephone,
t.Mobile,
t.Teacher,
t.TeacherAssistant,
t.PrimarySchool,
t.SecondarySchool,
Monday = COALESCE(pb.Monday, 'Not Available'),
Tuesday = COALESCE(pb.Tuesday, 'Not Available'),
Wednesday = COALESCE(pb.Wednesday, 'Not Available'),
Thursday = COALESCE(pb.Thursday, 'Not Available'),
Friday = COALESCE(pb.Friday, 'Not Available'),
t.Notes
FROM Teachers t
LEFT JOIN PivotedBookings pb
ON pb.TeacherID = t.ID
LEFT JOIN TeacherBands tb
ON tb.ID = t.Band;
附录
阅读此行:
WHEN bd.DayText = 'Thursday' AND bd.BookingDuration = 2 or (bd.BookingDuration = 1 and bd.BookingDuration = 0)
这使我相信全天有2种可能性,预订持续时间有2种,或者表中同一位老师和日期的AM和PM条目。 在这种情况下,有必要将数据轮换两次,因此您的第一个CTE变为:
WITH Bookings AS
( SELECT BookingDays.TeacherID,
[WeekDay] = DATENAME(WEEKDAY, BookingDate),
[Status] = CASE WHEN [2] > 0 THEN 'Full Day'
WHEN [0] > 0 AND [1] > 0 THEN 'xxx'
WHEN [0] > 0 THEN 'PM'
WHEN [1] > 0 THEN 'AM'
END
FROM ( SELECT TeacherID, BookingDate, BookingDuration, [X] = 1
FROM BookingDays
) BookingDays
PIVOT
( SUM(X)
FOR BookingDuration IN ([0], [1], [2])
) pvt
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.