聚合列上使用聚合函数:SQL分组占比查询实现求助
解决聚合列上计算百分比的SQL问题
嘿,我看到你在统计各建筑工单占比的时候遇到了小问题,咱们一步步把它搞定~
原问题回顾
你尝试的SQL语句:
Select Building, (Total_SRs/(Select SUM(Total_SRs) From Serveu)) As '%age' From (Select Building, Count(Building) as Total_SRs From serveu Group by Building)
期望得到的结果:
| Building | Total_SRs | %age |
|---|---|---|
| Abbey Crescent 1 | 83 | 4.36% |
| Abbey Crescent 2 | 68 | 3.57% |
| Barton House 1 | 12 | 0.63% |
| Botton House 1 | 11 | 0.58% |
| Botton House 2 | 3 | 0.16% |
修正后的SQL写法
方式一:修复原查询的问题
你的原SQL有两个核心小问题:一是内层子查询没加别名(数据库会报错),二是整数除法会导致百分比计算错误,咱们调整后:
SELECT Building, Total_SRs, -- 转浮点型计算+保留两位小数+添加百分号 CONCAT(ROUND((Total_SRs * 1.0 / total_all) * 100, 2), '%') AS '%age' FROM ( SELECT Building, COUNT(Building) AS Total_SRs, -- 提前计算全量工单总数,避免重复查询 (SELECT COUNT(*) FROM serveu) AS total_all FROM serveu GROUP BY Building ) AS building_totals;
方式二:用窗口函数更高效(推荐)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),直接用SUM() OVER()就能一步算出总数,代码更简洁:
SELECT Building, COUNT(Building) AS Total_SRs, CONCAT(ROUND((COUNT(Building) * 1.0 / SUM(COUNT(Building)) OVER()) * 100, 2), '%') AS '%age' FROM serveu GROUP BY Building;
关键细节说明
- 整数除法处理:
COUNT()返回的是整数,直接相除会得到0(比如83/1903≈0),所以用*1.0把整数转成浮点型,才能得到正确的小数占比。 - 子查询别名:SQL要求FROM后的子查询必须加别名,不然会抛出语法错误,这里给内层子查询加了
building_totals别名。 - 窗口函数优势:
SUM(COUNT(Building)) OVER()会自动计算所有分组的Total_SRs总和,不用额外写子查询,性能更优。
这样执行后就能得到你想要的带百分比的完整结果啦~
内容的提问来源于stack exchange,提问作者Hafeez
相关产品推荐
相关产品推荐

