n:m关系中的SQL聚合函数
该域是一个航空公司预订系统。用户可以预订航班。航班由一条或多条航段组成n:m关系中的SQL聚合函数,sql,entity-relationship,Sql,Entity Relationship,该域是一个航空公司预订系统。用户可以预订航班。航班由一条或多条航段组成 ┌─────┐ ┌──────┐ ┌───────┐ │ Leg ├────────┤Flight├──────┤Booking│ └─────┘ * * └──────┘1 * └───────┘ 要向用户显示有效航班的列表,系统必须查明航班是否有可用的免费座位。最大可用座位作为字段存储在Leg表中。预订的座位存储在Booking中 航班可能由多条航段组成。例如,可能有3个航
┌─────┐ ┌──────┐ ┌───────┐
│ Leg ├────────┤Flight├──────┤Booking│
└─────┘ * * └──────┘1 * └───────┘
要向用户显示有效航班的列表,系统必须查明航班是否有可用的免费座位。最大可用座位作为字段存储在Leg
表中。预订的座位存储在Booking
中
航班可能由多条航段组成。例如,可能有3个航段A->B->C,以及两个用户可以预订的航班:
select l.id as Leg, sum(b.number_passengers) as BookedSeats
FROM flight f
JOIN flight_legs fl on f.id = fl.flight_id
JOIN leg l on fl.legs_id = l.id
JOIN booking b on f.id = b.flight_id
GROUP BY l.id;
如何创建有可用座位的航班列表
例子
模式
腿
身份证件
有座位吗
1.
2.
2.
2.
以下查询实现所需的输出。如果前一段已满,我使用
Lag
功能转到前一行
SELECT Leg,
case
when Free_Seats = 0 then 0
else (case when PrevLeg = 0 then 0 else Free_Seats end) end as Free_Seats
FROM (SELECT Leg,Free_Seats,LAG(Free_Seats,1) OVER(ORDER BY Leg) PrevLeg
FROM (SELECT l.id AS Leg,l.seats_available,b.number_passengers,fl.flight_id,
(max(l.seats_available) OVER(PARTITION BY fl.flight_id) - sum(b.number_passengers) OVER(PARTITION BY fl.flight_id)) AS Free_Seats,
ROW_NUMBER() OVER(PARTITION BY fl.flight_id ORDER BY fl.flight_id) AS seq
FROM flight f
JOIN flight_legs fl ON f.id = fl.flight_id
JOIN leg l ON fl.legs_id = l.id
JOIN booking b ON f.id = b.flight_id) T
WHERE t.seq=1) T
如果需要,请输入所需的输出和样本数据possible@LucasEthen添加了dbfiddle示例的解释。谢谢。这给了我每条腿的免费座位。但我需要每个航班的免费座位。我理解,但您期望的输出是错误的,因为flight_id=1有两个航段记录,总共有四个座位,其中还有两个座位。然后我不清楚我的示例:第一航段有1名预订1的乘客(预订的航班1)和1名预订2的乘客(预订的航班2)。因此,航班1应提供0个免费座位,因为第一航段有两人预订(但不同的航班)。2号航班也应提供0个免费座位,因为第一航段已满,但第二航段将提供一个免费座位。更新了预期的输出。我实现了您的输出。我希望这是根据你的要求。不幸的是,这不起作用:不管为leg1设置了多少个座位,免费座位总是0()。而且飞机上也没有我的免费座位。相反,它提供免费的腿部座位。