结合两个SELECT语句SQL ORACLE 12C

时间:2017-08-06 09:38:13

标签: sql oracle12c

我试图将这两个SQL语句组合成一个语句。 首先,它是一个关于航空公司的数据库 路线,乘客,飞机,时刻表和预订表。

婴儿票价为50美元,而成人票价为251美元。 飞行路线共有15名成人和3名婴儿(RTI-005,Kota Kinabalu - Singapore)。

现在我正在尝试编写一个选择语句,该语句将显示根据路线(来源/目的地)生成的总收入,并且它将被分成"成人票价"和"婴儿票价" (出生于2015年至2017年之间)以下是两个选择语句的示例:https://i.gyazo.com/755c34da6d58714efbce4a6c7373c563.png

以下是两个选择语句:

SELECT R.route_id, R.origin "Origin", R.destination "Destination", 
TO_CHAR(SUM(R.infant_ticket_price), 99999999.99) "Infant ticket"
FROM Reservation Re, Schedule S, Route R, Passenger P
WHERE P.passenger_id = Re.passenger_id AND Re.flight_no = S.flight_no AND 
S.route_id = R.route_id
AND P.date_of_birth BETWEEN '01-JAN-2015' AND '31-DEC-2017'
GROUP BY R.route_id, R.origin, R.destination
ORDER BY R.route_id;

SELECT R.route_id, R.origin "Origin", R.destination "Destination", 
TO_CHAR(SUM(R.adult_ticket_price), 99999999.99) "Adult ticket"
FROM Reservation Re, Schedule S, Route R, Passenger P
WHERE P.passenger_id = Re.passenger_id AND Re.flight_no = S.flight_no AND 
S.route_id = R.route_id
AND P.date_of_birth NOT BETWEEN '01-JAN-2015' AND '31-DEC-2017'
GROUP BY R.route_id, R.origin, R.destination
ORDER BY R.route_id;

2 个答案:

答案 0 :(得分:1)

考虑条件聚合,将WHERE子句移动到CASE中的SELECT语句中。并且使用显式连接而不是隐含,因为您使用的是25年前引入的ANSI标准。

SELECT R.route_id, R.origin "Origin", R.destination "Destination", 
       TO_CHAR(SUM(CASE WHEN P.date_of_birth BETWEEN '01-JAN-2015' AND '31-DEC-2017' 
                        THEN R.infant_ticket_price
                        ELSE 0
                   END), 99999999.99) "Infant ticket",
       TO_CHAR(SUM(CASE WHEN P.date_of_birth NOT BETWEEN '01-JAN-2015' AND '31-DEC-2017' 
                        THEN R.adult_ticket_price
                        ELSE 0
                   END), 99999999.99) "Adult ticket"
FROM Reservation Re
INNER JOIN Passenger P ON P.passenger_id = Re.passenger_id 
INNER JOIN Schedule S ON Re.flight_no = S.flight_no
INNER JOIN Route R ON S.route_id = R.route_id
GROUP BY R.route_id, R.origin, R.destination
ORDER BY R.route_id;

答案 1 :(得分:0)

由于您在GROUP BY中使用了相同的列,因此您只能使用一个查询。

SELECT R.route_id, R.origin "Origin", R.destination "Destination", 
TO_CHAR(SUM(R.infant_ticket_price), 99999999.99) "Infant ticket",
TO_CHAR(SUM(R.adult_ticket_price), 99999999.99) "Adule ticket"
FROM Reservation Re, Schedule S, Route R, Passenger P
WHERE P.passenger_id = Re.passenger_id AND Re.flight_no = S.flight_no AND 
S.route_id = R.route_id
AND P.date_of_birth BETWEEN '01-JAN-2015' AND '31-DEC-2017'
GROUP BY R.route_id, R.origin, R.destination
ORDER BY R.route_id;
相关问题