Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-基于多行减法显示可用座位_Sql_Postgresql - Fatal编程技术网

SQL-基于多行减法显示可用座位

SQL-基于多行减法显示可用座位,sql,postgresql,Sql,Postgresql,我一直在尝试编写一个查询,从几个表中检索航班信息和座位预订,我的目标是显示取消('C')、保留('R')和可用座位数的航班详细信息。我已设法获得取消和预订座位的详细信息,但我正在努力根据这些信息计算可用座位。似乎因为有两排,所以这一排是在重置座位数,而不是正确计算座位数。我的代码在下面 SELECT f.FlightID, f.FlightDate, fb.Status, sum(numseats) AS NumberOfTotalSeats, maxcapacity - sum(numsea

我一直在尝试编写一个查询,从几个表中检索航班信息和座位预订,我的目标是显示取消('C')、保留('R')和可用座位数的航班详细信息。我已设法获得取消和预订座位的详细信息,但我正在努力根据这些信息计算可用座位。似乎因为有两排,所以这一排是在重置座位数,而不是正确计算座位数。我的代码在下面

SELECT f.FlightID, f.FlightDate, fb.Status, sum(numseats) AS 
NumberOfTotalSeats, maxcapacity - sum(numseats) AS NumberOfAvailiableSeats
FROM Flight f
INNER JOIN FlightBooking fb ON f.FlightID = fb.FlightID
WHERE (f.flightID = 5 AND fb.status = 'R') OR (f.flightID = 5 AND fb.status 
= 'C')
GROUP BY f.FlightID, fb.status
目前,它返回以下内容:

FlightID, FlightDate,         Status, NumberOfTotalSeats, NumberOfAvailableSeats

   5, 2017-04-07 00:00:00,     C,                 10,                    490
   5 ,2017-04-07 00:00:00,     R,                  2,                    498
我希望NumberOfAvailableSets列为每个列显示488,并编辑我的查询以允许这样做。我正在使用PostgreSQL 9.6


提前谢谢

您希望将
总和置于两个状态总和之上:

SELECT 
  f.FlightID, 
  f.FlightDate, 
  fb.Status, 
  sum(fb.numseats) AS NumberOfTotalSeats, 
  f.maxcapacity - sum(sum(fb.numseats)) over (partition by f.FlightID)
    AS NumberOfAvailiableSeats
FROM Flight f
INNER JOIN FlightBooking fb ON f.FlightID = fb.FlightID
WHERE f.flightID = 5 AND fb.status IN ('R','C') 
GROUP BY f.FlightID, fb.status;
然而,正如pozs所提到的,用一行文字就能更容易阅读:

SELECT 
  f.FlightID, 
  f.FlightDate,
  f.maxcapacity,
  sum(case when fb.Status = 'R' then fb.numseats else 0 end) as reserved,
  sum(case when fb.Status = 'C' then fb.numseats else 0 end) as cancelled,
  f.maxcapacity - sum(fb.numseats) AS NumberOfAvailiableSeats
FROM Flight f
INNER JOIN FlightBooking fb ON f.FlightID = fb.FlightID
WHERE f.flightID = 5 AND fb.status IN ('R','C') 
GROUP BY f.FlightID;

正如波茨在另一个问题中所问的:减去所有预订和取消的座位有意义吗?所以,取消预订和预订一样会阻碍座位?可能您必须调整算法甚至数据模型。

您的左连接作为常规内部连接执行,因为WHERE子句中有这些fb条件。谢谢,已更改了codeSidenote中的连接注意:为什么需要两个单独的行?带有
FlightID、FlightDate、NumberOfReservedSeats、NumberOfCancelled seats、NumberOfAvailableSeats
的单行将更易于使用。取消的座位是否可以再次预订?如果是,是否有座位ID(在
航班预订
的那些行中可能相同)?(请发布整个表定义和示例数据)。,-所有表和列都相同。它是什么?