我希望在给定的日期时间范围内获得:
我有3张桌子(机场,航班和机票):
Airport data:
id | name
1 , Madrid Airport
2 , Amsterdam Airport
3 , Belgrade Airport
----------------------------------------------
Flight data:
id | number | departureDate | arrivalDate | departureAirport | arrivalAirport | price
1 , 101 ,2019-01-29 19:21:44,2019-01-29 22:21:44, Madrid Airport , Amsterdam Airport, 600
2 , 102 ,2019-01-29 22:21:44,2019-01-30 00:21:44, Madrid Airport , Belgrade Airport , 450
3 , 103 ,2019-01-30 20:21:44,2019-01-30 22:21:44, Belgrade Airport , Amsterdam Airport, 555
4 , 104 ,2019-02-10 20:21:44,2019-02-10 22:21:44, Belgrade Airport , Madrid Airport , 555
----------------------------------------------
Ticket data:
id | FlightId | dateOfSale
1 , 3 , 2019-01-23 00:00:00
2 , 3 , 2019-01-27 10:00:00
3 , 1 , 2019-01-27 13:00:00
日期时间范围示例:
最小:2019-01-25 19:21:44
最大值:2019-02-02 00:00:00
在给定的日期时间范围内,只有第四个航班不会通过条件,因为其DateDate不在给定的范围内,其他三个航班都将通过。
现在,我们有阿姆斯特丹机场(x2)和贝尔格莱德机场(x1)作为到达机场。 所以前两列应该这样表示:
Name of Airport | Number of Flights |
Amsterdam Airport, 2
Belgrade Airport , 1
第三张代表售出的门票数量,而dateOfSale也在指定的日期时间范围内。
在机票表中出售了3张机票,购买了前两张ID = 3的航班,购买了第三张ID = 1的航班。 由于第一张机票的dateOfSale不在指定的日期时间范围内,因此只有第二张和第三张机票会通过,并且它们都代表称为阿姆斯特丹机场的到达机场。
所以最终结果应该是:
Name of Airport | Number of Flights | Number of sold tickets | Total price
Amsterdam Airport, 2 , 2 , 1155
Belgrade Airport , 1 , 0 , 0
我尝试过这样的事情:
select a.name, count(f.arrivalAirport) as 'number of flights',
count(t.dateOfSale) as 'number of sold tickets', sum(f.price) from airport a,
flight f, ticket t where a.name = f.arrivalAirport and f.departureDate >
'2019-01-25 19:21:44' and f.departureDate < '2019-02-02 00:00:00' and
t.flightId = f.id and t.dateOfSale > '2019-01-25 19:21:44' and t.dateOfSale
< '2019-02-02 00:00:00' group by a.name;
仅执行此操作,它便会完全计数应该售出的机票数,但航班数是错误的。
我不确定如何继续进行。我在此查询中缺少什么,可以这样做吗?还是必须包含join(我也遇到问题)?