使用count和group by分组查询时如何计算各分组的百分比数值
可以直接实现,主流数据库可以通过窗口函数快速得到结果,具体实现方案如下:
- 方案1:支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等通用写法)
直接在聚合后用窗口函数计算全局总条数,不需要额外子查询扫描表,性能最优:
SELECT no_tipo_origem, COUNT(*) AS total, ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 1) AS percentage FROM `table` GROUP BY no_tipo_origem
计算逻辑说明:SUM(COUNT(*)) OVER() 会基于全表聚合后的结果计算所有分组的计数总和,也就是全表总记录数;乘以100.0是为了避免整数除法得到0的问题,最后用ROUND保留1位小数即可匹配你需要的输出格式。
- 方案2:不支持窗口函数的低版本数据库(如MySQL 5.x)
用子查询先计算全表总条数,再关联计算百分比:
SELECT no_tipo_origem, COUNT(*) AS total, ROUND(COUNT(*) * 100.0 / t.total_count, 1) AS percentage FROM `table`, (SELECT COUNT(*) AS total_count FROM `table`) t GROUP BY no_tipo_origem
内容的提问来源于stack exchange,提问作者Italo Rodrigo
相关产品推荐
相关产品推荐

