Basically, I need to show the number of reserved , cancelled and available seats for a train.
I have this for the available seats:
x
SELECT t.trainid, t.maxcapacity - coalesce(sum(b.numseats), 0) as availableseats
FROM Train t
left JOIN TrainBooking b
ON t.TrainID = b.TrainID
WHERE b.Status IN ('r')
GROUP BY t.TrainID , t.maxcapacity
In the trainbooking table, I have a column called “status”. Status is either reserved or cancelled. I need to display the reserved and cancelled seats with the available seats, but i’m not sure how to do this.
Example data of the two tables:
Train:
TrainId maxseats
1 10
2 10
Trainbooking:
bookingid trainid status numseats
1 1 'r' 2
2 1 'c' 2
3 2 'r' 3
Results:
trainid availableseats cancelledseats reservedseats
1 8 2 2
2 7 0 3
I’m new to SQL so any help would be appreciated – thanks.
Advertisement
Answer
Try the following, here is the demo.
select
trainId,
(maxSeats - reservedSeats) as availableSeats,
cancelledSeats,
reservedSeats
from
(
select
t.trainId,
maxSeats,
sum(case when status = 'c' then numseats else 0 end) as cancelledSeats,
sum(case when status = 'r' then numseats else 0 end) as reservedSeats
from train t
join trainBooking tb
on t.trainId = tb.trainId
group by
t.trainId,
maxSeats
) vals
order by
trainId
Output:
| trainid | availableSeats | cancelledSeats| reservedSeats |
| ------- | -------------- | ------------- | ------------- |
| 1 | 8 | 2 | 2 |
| 2 | 7 | 0 | 3 |