如何合并City与Vehicle表并按城市分组统计各车型数量?
解决方案
要实现按城市分组统计各车型数量并生成包含总数的结果,你需要使用条件聚合,同时以City表为主表进行左连接,确保所有城市都能被统计(包括无车辆的城市)。
原SQL的问题
- 仅筛选了
Electric类型的车辆,因此只能得到该车型的统计结果,缺少Fuel和Total列 - 使用
Vehicle LEFT JOIN City会导致如果某个城市没有车辆,就不会出现在结果中(虽然你的示例数据里没有这种情况,但逻辑上存在漏洞) - 未处理"无数据则填0"的需求
正确SQL语句
SELECT c.City_Name, SUM(CASE WHEN v.Vehicle_Type = 'Electric' THEN 1 ELSE 0 END) AS Electric, SUM(CASE WHEN v.Vehicle_Type = 'Fuel' THEN 1 ELSE 0 END) AS Fuel, COUNT(v.Vehicle_Id) AS Total FROM City c LEFT JOIN Vehicle v ON c.City_Id = v.City_Id GROUP BY c.City_Id, c.City_Name ORDER BY c.City_Name;
代码逻辑说明
- 主表选择:以
City表为基础做左连接,保证所有城市都能出现在结果中,即使该城市没有任何车辆 - 条件聚合统计车型:
SUM(CASE...):针对每种车型,匹配到则计1,否则计0,求和后得到对应车型的数量,无数据时自动返回0
- 总数统计:
COUNT(v.Vehicle_Id)统计每个城市关联到的车辆总数(因为LEFT JOIN后无车辆的城市Vehicle_Id为NULL,COUNT会忽略NULL,返回0) - 分组与排序:按城市的
City_Id和City_Name分组(避免不同城市重名的问题),最后按城市名称排序
执行上述SQL后,会得到你期望的结果:
| City_Name | Electric | Fuel | Total |
|---|---|---|---|
| New York | 1 | 2 | 3 |
| Washington | 1 | 1 | 2 |
内容的提问来源于stack exchange,提问作者MAY
相关产品推荐
相关产品推荐

