У меня есть следующие таблицы в моей базе данных Oracle 11g:
CREATE TABLE travels
(
Day DATE,
Flight_Code VARCHAR2(7),
Airplane_Code VARCHAR2(7),
CONSTRAINT pk PRIMARY KEY(day,flight_code)
);
и
CREATE TABLE boardings
(
Passport VARCHAR2(7),
Day DATE,
Flight_Code VARCHAR2(7),
Luggage_Weight NUMBER(4,2),
CONSTRAINT pk PRIMARY KEY(passport,day,flight_code)
);
Поэтому я пытаюсь сделать запрос, чтобы увидеть для каждого самолета это был рейс (Day и Flight_Code), в котором он перевозил максимальный вес, причем это количество всегда превышает 100 (имейте в виду, что один и тот же рейс, как, например, RY-1234-VY, может совершать различные поездки в разные дни, но не более одного в один и тот же день).
Я пробовал что-то подобное, но это не работает, потому что он возвращается для каждого рейса, который был днем, когда он был перевезен больше Luggage_Weight и самолет, который это сделал.
SELECT Airplane_Code, Day, Flight_Code
FROM Travels
WHERE (Day, Flight_Code) IN (SELECT Day, Flight_Code
FROM boardings b1
GROUP BY Day, Flight_Code
HAVING SUM(Luggage_Weight) = (SELECT MAX(SUM(Luggage_Weight))
FROM boardings b2
WHERE b1.Flight_Code = b2.Flight_Code
GROUP BY Day, Flight_Code
HAVING SUM(Luggage_Weight) > 100))
GROUP BY Airplane_Code, Day, Flight_Code;
Я хотел бы, чтобы решение использовало структуру GROUP BY и HAVING.
Например:
INSERT INTO travels VALUES ('04/04/2020', 'RY1234', 'ABCD');
INSERT INTO travels VALUES ('03/04/2020', 'RY1234', 'ABCD');
INSERT INTO boardings VALUES ('ES1234', '04/04/2020', 'RY1234', '51');
INSERT INTO boardings VALUES ('ES5678', '04/04/2020', 'RY1234', '50');
INSERT INTO boardings VALUES ('ES9101', '03/04/2020', 'RY1234', '100');
Как вы можете видеть, один и тот же рейс (RY1234) прошел за 2 разных дня, поэтому в 03/04 общий вес багажа составил 100 кг, но в 04/04 общий вес багажа составил 101 кг. Результат должен быть следующим:
ABCD ---- 04/04/2020 ---- RY1234
В случае, если он не набрал бы 100 кг ни на одном из своих полетов для того же самолета, этот код самолета не должен отображаться.