Спасибо Фредту за то, что он указал мне правильное направление ...
, чтобы присоединить к основной таблице все записи со всеми записями и затем выполнить фильтрацию на основе перекрывающихся критериев дат курса.
Запрос, приведенный ниже, неэффективен, но пока что выполняет свою работу .... может быть больше оптимизаций, я хотел бы услышать другое мнение
SELECT
THIS_COURSE.COURSE_ID,
OTHER_COURSE.ROOM_TYPE_ID,
SUM(CASE WHEN THIS_COURSE.BOOKING_ID = OTHER_COURSE.BOOKING_ID THEN OTHER_COURSE.NUMBER_OF_STUDENTS ELSE 0 END) AS COURSE_STUDENTS,
SUM(CASE WHEN THIS_COURSE.BOOKING_ID <> OTHER_COURSE.BOOKING_ID THEN OTHER_COURSE.NUMBER_OF_STUDENTS ELSE 0 END) AS OTHER_STUDENTS,
SUM(OTHER_COURSE.NUMBER_OF_STUDENTS) AS TOTAL_STUDENTS
FROM
(
SELECT
BOOKINGS.BOOKING_ID,
BOOKINGS.COURSE_ID,
BOOKINGS.NUMBER_OF_STUDENTS,
BOOKINGS.ROOM_TYPE_ID,
COURSES.START_DATE,
COURSES.END_DATE
FROM
BOOKINGS , COURSES
WHERE
BOOKINGS.COURSE_ID = COURSES.COURSE_ID
) THIS_COURSE
LEFT JOIN
(
SELECT
BOOKINGS.BOOKING_ID,
BOOKINGS.COURSE_ID,
BOOKINGS.NUMBER_OF_STUDENTS,
BOOKINGS.ROOM_TYPE_ID,
COURSES.START_DATE,
COURSES.END_DATE
FROM
BOOKINGS , COURSES
WHERE
BOOKINGS.COURSE_ID = COURSES.COURSE_ID
) OTHER_COURSE
ON
THIS_COURSE.BOOKING_ID <> OTHER_COURSE.BOOKING_ID OR
THIS_COURSE.BOOKING_ID = OTHER_COURSE.BOOKING_ID
WHERE
(THIS_COURSE.START_DATE <= OTHER_COURSE.START_DATE AND THIS_COURSE.END_DATE >= OTHER_COURSE.END_DATE) OR
(THIS_COURSE.START_DATE <= OTHER_COURSE.START_DATE AND THIS_COURSE.END_DATE >= OTHER_COURSE.START_DATE) OR
(THIS_COURSE.START_DATE <= OTHER_COURSE.END_DATE AND THIS_COURSE.END_DATE >= OTHER_COURSE.END_DATE)
GROUP BY
THIS_COURSE.COURSE_ID, OTHER_COURSE.ROOM_TYPE_ID
Ниже приведен sql для создания примера данных
CREATE TABLE Bookings(BOOKING_ID INTEGER NOT NULL PRIMARY KEY, COURSE_ID INTEGER NOT NULL, NUMBER_OF_STUDENTS INTEGER NOT NULL, ROOM_TYPE_ID INTEGER NOT NULL)
CREATE TABLE Courses(COURSE_ID INTEGER NOT NULL PRIMARY KEY, START_DATE DATE, END_DATE DATE)
CREATE TABLE Rooms(ROOM_TYPE_ID INTEGER NOT NULL PRIMARY KEY, ROOM_CAPACITY INTEGER NOT NULL, ROOM_LOCATION VARCHAR(25))
INSERT INTO Bookings VALUES( 10 , 2 , 1 , 1 )
INSERT INTO Bookings VALUES( 20 , 1 , 2 , 1 )
INSERT INTO Bookings VALUES( 30 , 3 , 1 , 3 )
INSERT INTO Bookings VALUES( 40 , 1 , 3 , 4 )
INSERT INTO Bookings VALUES( 50 , 5 , 1 , 2 )
INSERT INTO Bookings VALUES( 60 , 6 , 2 , 2 )
INSERT INTO Bookings VALUES( 70 , 3 , 2 , 1 )
INSERT INTO Bookings VALUES( 80 , 4 , 1 , 3 )
INSERT INTO Bookings VALUES( 90 , 7 , 1 , 4 )
INSERT INTO Courses VALUES( 1 ,'2018-05-15', '2018-06-14' )
INSERT INTO Courses VALUES( 2 ,'2018-05-11', '2018-05-20' )
INSERT INTO Courses VALUES( 3 ,'2018-05-18', '2018-05-22' )
INSERT INTO Courses VALUES( 4 ,'2018-05-20', '2018-06-20' )
INSERT INTO Courses VALUES( 5 ,'2018-05-10', '2018-06-20' )
INSERT INTO Courses VALUES( 6 ,'2018-05-10', '2018-05-14' )
INSERT INTO Courses VALUES( 7 ,'2018-06-15', '2018-06-20' )
INSERT INTO Rooms VALUES( 1 , 1 , 'HILL')
INSERT INTO Rooms VALUES( 2 , 2 , 'HILL')
INSERT INTO Rooms VALUES( 3 , 1 , 'OCEAN')
INSERT INTO Rooms VALUES( 4 , 2 , 'OCEAN')