SQL如何在单条查询中计算每行成绩占总成绩的百分比
问题原因
你原来的写法无法正常运行有两个核心原因:
- SQL的执行顺序不允许在SELECT子句中直接引用同层级刚定义的别名
total - 未加窗口函数的
SUM()聚合会将所有行合并为单一聚合结果,无法保留原表的每一行数据
支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等通用写法)
用窗口函数OVER()实现全表总求和,每一行都会返回全表Grade总和,直接计算占比即可:
SELECT Grade, SUM(Grade) OVER () AS total, ROUND(Grade * 100.0 / SUM(Grade) OVER (), 2) AS `percent_total` FROM 你的表名;
说明:
- 乘
100.0是为了避免整数除法丢失小数精度 ROUND()的第二个参数可根据你需要保留的百分比小数位数调整- 带空格/特殊字符的别名需要用反引号(MySQL)、方括号(SQL Server)等转义
不支持窗口函数的低版本数据库(如MySQL 5.x)
用子查询先查询全表总Grade,再和原表关联计算,同样是单条查询:
SELECT t.Grade, s.total, ROUND(t.Grade * 100.0 / s.total, 2) AS `percent_total` FROM 你的表名 t, (SELECT SUM(Grade) AS total FROM 你的表名) s;
内容的提问来源于stack exchange,提问作者Galaxy S
相关产品推荐
相关产品推荐

