如何使用SQL按资源分组计算单列各行占分组总数量的百分比
SQL实现资源报废原因占比计算
核心实现思路
用窗口函数按资源维度统计总报废量,再逐行计算单原因报废量占总报废量的比例即可,不需要做行聚合合并,能保留原表所有报废原因行的结构。
通用SQL写法(支持窗口函数的数据库,如MySQL8.0+、PostgreSQL、Oracle、SQL Server等)
假设你的表名为resource_scrap,代码如下:
SELECT Resource, Reason, Qty, -- 计算数值型百分比,保留2位小数 ROUND(Qty * 100.0 / SUM(Qty) OVER (PARTITION BY Resource), 2) AS scrap_percent, -- 可选:输出带%符号的字符串格式百分比 CONCAT(ROUND(Qty * 100.0 / SUM(Qty) OVER (PARTITION BY Resource), 2), '%') AS scrap_percent_str FROM resource_scrap;
逻辑说明
SUM(Qty) OVER (PARTITION BY Resource)是窗口函数,会按Resource字段分组统计每个资源的总报废量,该值会同步到同个资源对应的所有行,不会合并原表行结构,可直接和每行的Qty做除法运算。- 乘以
100.0而非100是为了强制走浮点运算,避免部分数据库的整数除法规则导致计算结果为0的问题。
旧版本数据库兼容写法(不支持窗口函数,如MySQL5.x)
可以先用子查询统计每个资源的总报废量,再关联原表计算占比:
SELECT t1.Resource, t1.Reason, t1.Qty, ROUND(t1.Qty * 100.0 / t2.total_qty, 2) AS scrap_percent FROM resource_scrap t1 INNER JOIN ( SELECT Resource, SUM(Qty) AS total_qty FROM resource_scrap GROUP BY Resource ) t2 ON t1.Resource = t2.Resource;
内容的提问来源于stack exchange,提问作者lostcoder
相关产品推荐
相关产品推荐

