Как получить количество двух столбцов таблицы на основе ПК другой таблицы? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть две таблицы, определенные как:

CREATE TABLE airports (
  code char(3) not null primary key,
  name varchar(100) not null,
  city varchar(50) not null,
  state varchar(5),
  country char(2) not null references fcountries(code)
)

и

CREATE TABLE flights (
  departure char(3) not null references airports(code), -- airport code
  arrival char(3) not null references airports(code), -- airport code
  dep_time time not null,
  airline char(2) not null references airlines(code)
)

Мне нужно получить количество рейсов, вылетающих из аэропорта и прибывающих в аэропорт, используя postgres.Итак, я написал

select
  code,
  count(departure)
from airports 
join flights 
 on flights.departure = airports.code group by code;

и для отправления аналогично:

select
  code,
  count(arrival) as Arrival
from airports 
join flights 
  on flights.arrival = airports.code group by code;

Но мне нужно объединить эти два значения и получить счетчик прибытия-отправления в одном и том же результате.Я не уверен, как это сделать?Я написал этот запрос

select
  code,
  count(departure),
  x.arrival
from (
  select count(arrival) as arrival
  from airports 
  join flights 
    on flights.arrival = airports.code group by code
) x, 
airports 
join flights on airports.code = flights.departure
group by code, x.arrival
order by code;

Но результат неверный, так как в этом результате повторяется «код».Я довольно новичок в SQL и не знаю, как это написать.

Ответы [ 4 ]

0 голосов
/ 18 февраля 2019

Довольно простой метод - просто использовать коррелированный подзапрос COUNT в предложении SELECT:

select a.code,
    (select count(*) from flights f where f.departure = a.code) as departures,
    (select count(*) from flights f where f.arrival = a.code) as arrivals
from airports a;
0 голосов
/ 17 февраля 2019

Я думаю, что псевдоним t2 нельзя использовать таким образом после объединения, поэтому вы получаете сообщение об ошибке.Попробуйте это:

select t1.code, t1.count_departure, t2.count_arrival from ( select code, count(departure) count_departure from airports join flights on flights.departure = airports.code group by code ) t1 join ( select code, count(arrival) as count_arrival from airports join flights on flights.arrival = airports.code group by code ) t2 on t1.code = t2.code;

0 голосов
/ 17 февраля 2019

Самый простой метод - это боковое соединение и group by:

select v.code, count(*) as total,
       sum(is_departure) as num_departures,
       sum(is_arrival) as num_arrivals
from flights cross join lateral
     (values (departure, 1, 0), (arrival, 0, 1)
     ) as v(code, is_departure, is_rrival)
     on f.departure = a.code
group by v.code;

Обратите внимание, что от JOIN до airports не нужно, если вы на самом деле не хотите вводить больше информации, которой у вас нет.не упоминается в вопросе.

0 голосов
/ 17 февраля 2019

Вы можете использовать два запроса в качестве подзапроса и присоединиться

    select t1.code,  t1.count_departure, t2.count_arrival 
    from (
        select code, count(departure)  count_departure
        from airports join flights on flights.departure = airports.code 
        group by code

    ) t1  
    inner join  (
        select code, count(arrival) as  count_arrival 
        from airports join flights on flights.arrival = airports.code 
        roup by code

    ) t2 on t1.code  = t2.code ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...