2016-02-19 56 views
1

我一直在掙扎,真的很感激一些幫助:計數用兩個表,並顯示爲0沒有結果SQL

我有兩個表航班和載體。

航班

Flight_ID | Airport_Origin | Airport_Destination | Carrier_ID 
1 | DOM | IAD | 1 
2 | IAD | DOM | 4 
3 | BAL | UEI | 1 
4 | LAX | CHI | 2 
5 | VAS | SDA | 3 
6 | MUM | PAR | 2 
7 | LAD | BOS | 4 

運營商

carrier_ID | Carrier_Name 
1 | American 
2 | southwest 
3 | delta 
4 | united 
5 | spirit 

我想和航班數量的計數來顯示它的名字各承運航空公司。如果航空公司沒有航班,它應該顯示0,並應顯示所有運營商。

輸出應該是:

CarrierName | NumberofFlights 
American | 2 
southwest | 2 
delta  | 1 
united  | 2 
spirit  | 0 

我的代碼:

select carriers.Carrier_Name AS 'Carrier Name', count(*) AS 'Number of Flights' 
from flights 
inner join carriers 
on flights.Carrier_ID = carriers.Carrier_ID 
group by Carrier_Name 
Order BY Carrier_Name 
; 

我似乎無法顯示,沒有航班爲0.我的輸出爲載體如下:

enter image description here

回答

0

這是一個LEFT JOIN(外連接)當記錄從加入可能不存在的右側部分:

select 
    c.Carrier_Name AS 'Carrier Name', count(f.Flight_ID) AS 'Number of Flights' 
from carriers c 
left join flights f on f.Carrier_ID = c.Carrier_ID 
group by Carrier_Name 
order by Carrier_Name 

也這可通過這樣的子查詢來完成:

select 
    c.Carrier_Name AS 'Carrier Name', 
    (select count(*) from flights f where f.Carrier_ID = c.Carrier_ID) AS 'Number of Flights' 
from carriers c 
order by Carrier_Name 

INNER JOIN意味着來自兩個部分對應的記錄加入必須存在。

+0

'count(*)'在'left join'查詢中出錯,它需要'count(f.something)'。 – Barmar

+0

確定,固定。謝謝! –

+0

感謝您的幫助Ivan!我之前沒有使用子查詢,這是一個很好的例子。還要感謝關於何時使用內部連接的提示。 – IronBat

1

您需要使用外連接,以便結果包含不匹配的行。然後COUNT函數必須對flights表中的一行進行計數,以便它不會計算不匹配時產生的空行。

SELECT c.carrier_name AS `Carrier Name`, COUNT(f.Flight_ID) AS `Number of Flights` 
FROM carriers AS c 
LEFT JOIN flights AS f ON f.carrier_ID = c.carrier_ID 
GROUP BY c.carrier_name 
ORDER BY c.carrier_name 
+0

非常感謝您的幫助!現在更有意義! – IronBat