SQL计算用户已通过合格课程占比异常:仅返回0或100%
问题描述
尝试计算用户已通过的合格课程占比,但执行以下SQL查询时,返回的占比结果只有0或100%,不符合预期:
Select passed_courses, eligible_courses, (passed_courses/eligible_courses) * 100 as 'PERCENT' FROM Training
查询结果:
| passed | eligible | PERCENT |
|---|---|---|
| 2 | 5 | 0 |
| 4 | 5 | 0 |
| 5 | 5 | 100 |
| 3 | 6 | 0 |
| 4 | 6 | 0 |
| 4 | 5 | 0 |
问题原因
这是整数除法特性导致的:你的passed_courses和eligible_courses都是整数类型,数据库在执行整数间的除法时,会直接舍弃小数部分,只保留整数结果。比如2/5的结果是0,乘以100后还是0;只有当分子等于分母时,5/5=1,乘以100才会得到100。
解决方案
只需要在计算时强制将运算转换为浮点/小数运算即可,有两种常用方式:
方式1:将其中一个字段转换为小数类型
SELECT passed_courses, eligible_courses, (CAST(passed_courses AS DECIMAL(10, 2)) / eligible_courses) * 100 AS PERCENT FROM Training
方式2:用1.0乘以分子,触发浮点运算
这种写法更简洁,无需显式转换类型:
SELECT passed_courses, eligible_courses, (passed_courses * 1.0 / eligible_courses) * 100 AS PERCENT FROM Training
如果需要控制结果的小数位数,可以用ROUND函数:
SELECT passed_courses, eligible_courses, ROUND((passed_courses * 1.0 / eligible_courses) * 100, 2) AS PERCENT FROM Training
上述代码会将占比结果保留2位小数。
内容的提问来源于stack exchange,提问作者Aaron1212
相关产品推荐
相关产品推荐

