多表连接结合GROUP BY子句计算城市占比的SQL实现问题
解决按城市计算Staff、Total及占比的SQL问题
嘿,我来帮你搞定这个需求!先理清楚我们要算的几个字段逻辑:
Staff:看结果里Delhi的Staff是10,对应Hospital表中Hospital1的Staff是5,而MainTable里Hospital1有2条记录,其实就是每条MainTable记录对应一次Staff值,直接求和就行Total:就是每个城市下所有Data的总和,比如Delhi的20+10=30,完全对应你要的结果Percentage:应该是Staff占Total的百分比,比如10/30≈33.33%这种
之前你用COUNT函数没搞定,是因为COUNT是统计记录条数的,而我们需要的是数值求和,所以得用SUM函数结合分组来实现。下面是具体的解决方案:
完整SQL语句
SELECT C.City, SUM(H.Staff) AS Staff, SUM(M.Data) AS Total, ROUND((SUM(H.Staff) * 100.0 / SUM(M.Data)), 2) AS Percentage FROM MainTable M JOIN Hospital H ON M.HospitalId = H.HospitalId JOIN City C ON M.City = C.CityId GROUP BY C.City ORDER BY C.City;
语句拆解说明
- 表关联:把三张表通过对应的ID关联起来——MainTable的
HospitalId连Hospital的HospitalId,MainTable的City(实际是CityId)连City表的CityId - 聚合计算:
SUM(H.Staff):因为MainTable里每条记录都对应一个医院的Staff,求和后正好是结果里的Staff值(比如Delhi两条记录,每条Staff是5,加起来就是10)SUM(M.Data):直接把每个城市的Data值加起来,得到TotalROUND(...,2):把占比转成百分比并保留两位小数,乘以100.0是为了避免整数除法的坑(比如10/30如果直接整数除会得到0,转成浮点运算就正常了)
- 分组:
GROUP BY C.City确保我们是按城市来聚合计算的,每个城市只出一条结果
执行后的结果
跑这个SQL后,你会得到和期望一致的表,Percentage字段也会自动算出:
| City | Staff | Total | Percentage |
|---|---|---|---|
| Delhi | 10 | 30 | 33.33 |
| Mumbai | 10 | 100 | 10.00 |
| New York | 30 | 50 | 60.00 |
为什么COUNT不行?
你之前用COUNT没成功很正常,因为COUNT是用来数有多少条记录的,比如COUNT(*)会得到每个城市的记录条数(Delhi是2),但我们需要的是Staff和Data的数值总和,所以得用SUM函数才对~
内容的提问来源于stack exchange,提问作者Fhd.ashraf
相关产品推荐
相关产品推荐

