SQL中使用AVG函数计算男性患者占比的逻辑解析
详解AVG(gender = 'M')计算男性患者占比的逻辑
问题背景
需要计算男性患者占总患者的比例,结果保留两位小数并以百分比形式展示。
网站提供的解法
SELECT round(100 * avg(gender = 'M'), 2) || '%' AS percent_of_male_patients FROM patients;
AVG函数在这里的工作原理
在多数SQL方言中,布尔表达式会自动转换为数值类型:
- 当
gender = 'M'成立时,表达式结果为TRUE,会被转为数值1 - 当表达式不成立时,结果为
FALSE,会被转为数值0
AVG()函数会计算所有行中这些数值的平均值,也就是「男性患者数量 ÷ 总患者数量」,直接得到男性患者的占比(小数形式,比如占35%就会得到0.35)。
后续的100 * ...是把小数占比转为百分比数值,round(...,2)保留两位小数,最后用|| '%'拼接百分号,得到格式化后的百分比字符串。
你的解法逻辑
SELECT CONCAT(ROUND((SUM(CASE WHEN gender='M' THEN 1.0 ELSE 0.0 END)/COUNT(DISTINCT patient_id))*100,2) , '%') PERCENT FROM patients
你的写法是统计占比的标准实现方式:用CASE语句标记男性患者为1、非男性为0,通过SUM得到男性总数;除以总患者数(如果patient_id是唯一主键,用COUNT(*)会更高效)后乘以100得到百分比,最后格式化输出。这个逻辑完全正确,和网站解法的计算结果一致,只是实现思路不同。
内容的提问来源于stack exchange,提问作者Zaw Lynn Htut
相关产品推荐
相关产品推荐

