如何拆分单列性别并分别统计:求女性平均体重及低于该值的男性数
解决方案
你现在的问题是把女性平均体重硬写成了固定值77,得改成动态获取这个平均值才行,下面给你几种可行的写法:
方法1:子查询直接嵌套
直接在统计男性的查询里嵌套计算女性平均体重的子查询,逻辑直观:
SELECT COUNT(patient_weight) AS under_avg_male_count FROM patients WHERE gender = 'M' AND patient_weight < ( SELECT AVG(patient_weight) FROM patients WHERE gender = 'F' );
子查询会先算出女性的平均体重,外层查询再用这个值筛选符合条件的男性并计数。
方法2:用CTE(公共表表达式)
如果后续逻辑需要扩展,用CTE可读性更好:
WITH FemaleAvgWeight AS ( SELECT AVG(patient_weight) AS avg_female_weight FROM patients WHERE gender = 'F' ) SELECT COUNT(patient_weight) AS under_avg_male_count FROM patients CROSS JOIN FemaleAvgWeight WHERE gender = 'M' AND patient_weight < avg_female_weight;
先把女性平均体重存到临时的CTE中,再和原表关联筛选目标数据。
方法3:用变量存储平均值(适用于SQL Server)
如果使用SQL Server,也可以先把平均值存入变量再调用:
DECLARE @avg_female_weight DECIMAL(10,2); SET @avg_female_weight = (SELECT AVG(patient_weight) FROM patients WHERE gender = 'F'); SELECT COUNT(patient_weight) AS under_avg_male_count FROM patients WHERE gender = 'M' AND patient_weight < @avg_female_weight;
另外补充:你的原代码里用了LIKE 'F',性别是固定枚举值,用=比LIKE更高效,因为LIKE是模糊匹配语法,这里完全没必要使用。
内容的提问来源于stack exchange,提问作者PrxPedro
相关产品推荐
相关产品推荐

