2015-06-23 2 views
0

Учитывая следующую схему:Подсчет различных значений из нескольких столбцов

id departure arrival 
0 BOS  LAX 
1 SFO  SEA 
2 MIA  LAX 
3 RDU  BOS 
4 JFK  DEN 
5 LAX  SEA 

мне нужно подсчитать общее число вхождений каждого аэропорта. Например, BOS должен быть 2 (один вылет и один приезд).

Я могу сделать это с помощью двух отдельных запросов:

SELECT departure, COUNT(*) FROM legs 
GROUP BY departure ORDER BY COUNT(departure) DESC 

и

SELECT arrival, COUNT(*) FROM legs 
GROUP BY arrival ORDER BY COUNT(arrival) DESC 

, но я не был в состоянии выяснить, или найти способ сделать это в одном запрос. Я хотел бы иметь что-то вроде следующего:

airport count 
BOS  2 
LAX  2 
SEA  2 
JFK  1 

ответ

4

Делают это с union:

select departure as airport, count(*) as count 
from (select departure from legs 
     union all 
     select arrival from legs)t 
group by departure 
+1

И дать точный желаемый результат, 'отъезд в аэропорт, COUNT (*) в качестве count' – Tom

+1

Логически было бы, возможно, даже сделать больше смысла добавить псевдоним «аэропорт» внутри внутреннего запроса. – shawnt00

+0

Отлично! Время, чтобы прочитать «союз», я думаю ... –

0

Используйте FULL [OUTER] JOIN на двух отдельных агрегатов:

SELECT airport, COALESCE(d.ct, 0) + COALESCE(a.ct, 0) AS "count" 
FROM (
    SELECT departure AS airport, count(*) AS ct 
    FROM legs 
    GROUP BY 1 
    ) d 
FULL JOIN (
    SELECT arrival AS airport, count(*) AS ct 
    FROM legs 
    GROUP BY 1 
    ) a USING (airport) 
ORDER BY "count" DESC, airport; 

Таким образом, вы можете легко возвратите дополнительные столбцы для прибытия и вылета, и вы можете использовать индексы в базовой таблице, если вам нужно выбрать определенные аэропорты.

Последние родственный ответ:

Смежные вопросы