2016-02-19 82 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

相关问题