You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

聚合列上使用聚合函数: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)

期望得到的结果:

BuildingTotal_SRs%age
Abbey Crescent 1834.36%
Abbey Crescent 2683.57%
Barton House 1120.63%
Botton House 1110.58%
Botton House 230.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;

关键细节说明

  1. 整数除法处理:COUNT()返回的是整数,直接相除会得到0(比如83/1903≈0),所以用*1.0把整数转成浮点型,才能得到正确的小数占比。
  2. 子查询别名:SQL要求FROM后的子查询必须加别名,不然会抛出语法错误,这里给内层子查询加了building_totals别名。
  3. 窗口函数优势:SUM(COUNT(Building)) OVER()会自动计算所有分组的Total_SRs总和,不用额外写子查询,性能更优。

这样执行后就能得到你想要的带百分比的完整结果啦~

内容的提问来源于stack exchange,提问作者Hafeez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:34:11