2013-04-10 122 views
0
CREATE TABLE Flight 
(
    FlightID INTEGER NOT NULL, 
    FlightDate TIMESTAMP NOT NULL, 
    Origin VARCHAR(30) NOT NULL, 
    Destination VARCHAR(30) NOT NULL, 
    MaxCapacity INTEGER NOT NULL, 
    PricePerSeat DECIMAL NOT NULL 

) 
CREATE TABLE FlightBooking 
(
    BookingID INTEGER NOT NULL, 
    CustomerID INTEGER NOT NULL, 
    FlightID INTEGER NOT NULL, 
    NumSeats INTEGER NOT NULL, 
    Status CHAR(1) NOT NULL, 
    BookingTime TIMESTAMP NOT NULL, 
    TotalCost DECIMAL 

) 
status = Reserve, Held Cancelled or Expired (only reserved and held are taken into account) 
CREATE TABLE SeatBooking 
(
    BookingID INTEGER NOT NULL, 
    PassengerID INTEGER NOT NULL, 
    SeatNumber CHAR(4) 

) 

有反正我能得到座椅的状态,如果FLIGHTID,并给出和总可用座位,总保留席位,总席位SQL,连接两个或多个表,并返回结果

总数
+0

状态是char(1),但你列出一些单词。我们如何回答这个问题,你是不是告诉我们魔法代码字母的状态? – Hogan 2013-04-10 16:30:07

+0

你正在使用什么SQL平台--SQL Server,Oracle,DB2,MySQL,SQLite或其他? – Hogan 2013-04-10 16:31:05

+0

@ user2266419 - 如果答案有帮助,请注册并选择复选标记作为正确的答案 - 不要编辑您的答案,谢谢。这意味着没有人能看到这个问题。 – Hogan 2013-04-10 18:03:10

回答

0

有反正我能得到座椅的状态,如果FLIGHTID是 给出和总数的总可用座位,总 保留席位,总席位

是的,有!我假设使用Oracle,SQL Server或DB2并使用CTE。如果您没有其中一个必须使用子查询或临时表。

总保留席位,如果“R”是状态代码(你可以限制这一个航班,如果你在where子句中想,但这些查询给你所有的广告投放ID值):

SELECT SUM(NumSeats), FlightID 
FROM FlightBooking 
WHERE Status = 'R' 
GROUP BY FlightID 

总拥有席位,如果 'H' 是状态代码:

SELECT SUM(NumSeats), FlightID 
FROM FlightBooking 
WHERE Status = 'H' 
GROUP BY FlightID 

总可用座位则是:

WITH used AS 
    (
     SELECT SUM(NumSeats) as used, FlightID 
     FROM FlightBooking 
     WHERE Status in ('R','H') 
     GROUP BY FlightID 
    ) 
    SELECT F.MaxCapacity-U.Used, F.FlightID 
    FROM used U 
    JOIN Flight F ON U.FlightID = F.FlightID 
+0

但问题是,当我运行其不显示状态是过期或取消时的值,对不起,我不是很清楚我的问题也许你可以请告诉我,当状态也是如何返回表E或C(当它的E或C不影响最大容量时) – user2266419 2013-04-11 01:47:38

+0

@ user2266419 - 是的,有一个问题 - 你忽略了我的评论,并没有阅读我的答案。它**很清楚如何使用我的答案**中的其他代码。另外,回答我在评论中提出的两个问题。 – Hogan 2013-04-11 03:00:00

+0

我正在使用PgAdmin – user2266419 2013-04-11 11:49:25

0

鉴于飞行ID,你应该能够得到总的可用座位,总保留席位和总拥有席位,像这样:

select MaxCapacity - Reserved - Held as Available, Reserved, Held 
from 
(select f.MaxCapacity, 
     sum(case b.status when 'R' then b.NumSeats end) Reserved, 
     sum(case b.status when 'H' then b.NumSeats end) Held 
from Flight f 
left join FlightBooking b on f.FlightID = b.FlightID 
where f.FlightID = ?) sq