f.arrival_city,
f.aircraft_code,
count( tf.ticket_no ) AS fact_passengers,
( SELECT count( s.seat_no )
FROM seats s
WHERE s.aircraft_code = f.aircraft_code
) AS total_seats
FROM flights_v f
JOIN ticket_flights tf ON f.flight_id = tf.flight_id
WHERE f.status = 'Arrived'
GROUP BY 1, 2, 3, 4, 5, 6
)
SELECT ts.flight_id,
ts.flight_no,
ts.scheduled_departure_local,
ts.departure_city,
ts.arrival_city,
a.model,
ts.fact_passengers,
ts.total_seats,
round( ts.fact_passengers::numeric /
ts.total_seats::numeric, 2 ) AS fraction
FROM ts
JOIN aircrafts AS a ON ts.aircraft_code = a.aircraft_code
ORDER BY ts.scheduled_departure_local;
Конструкция WITH ts AS (...) и представляет собой общее табличное выражение
(CTE). Такие конструкции удобны тем, что позволяют упростить основной запрос,
сделать его менее громоздким. В общем табличном выражении может присутство-
вать больше одного подзапроса. Каждый подзапрос формирует временную таблицу с
указанным именем. Если имена столбцов этой таблицы не заданы явным образом
в виде списка, тогда они определяются на основе списка столбцов в предложении
SELECT. В нашем примере это будет именно так. Теперь мы можем в главном запросе
обращаться к временной таблице ts так, как если бы она существовала постоянно. Но
важно учитывать, что временная таблица, создаваемая в общем табличном выраже-
нии, существует только во время выполнения запроса.
В этой главе мы уже решали задачу распределения сумм бронирований по диапазо-
нам с шагом в сто тысяч рублей. Тогда мы использовали предложение VALUES для
формирования виртуальной таблицы. Можно решить эту задачу более рациональ-
ным способом с использованием конструкции WITH ... AS (...).
Сначала покажем, как можно сформировать диапазоны сумм бронирований с помо-
щью
Достарыңызбен бөлісу: