求助:如何用SQL计算分组比例及泰坦尼克号各舱位存活率(代码报错)
如何计算按另一列分组的比例?
下午好!咱们来解决你这个计算泰坦尼克号各舱位存活率的问题~
首先得说说你现有代码里的几个问题:
- 你在主查询里用了
total字段,但这个字段根本没在主查询中定义,HAVING子句里的子查询返回了class和total两列,没法和主查询的total匹配,这会直接导致语法错误。 - 你加了
WHERE survived == 'yes'过滤条件,这会把未存活的乘客全部排除,最后统计的存活数除以的总数其实是过滤后的存活人数,完全不符合“该舱位中存活乘客占比”的需求。
接下来给你两种简单靠谱的解法:
方法一:用条件聚合直接计算(最简洁)
这种方法用CASE语句标记存活乘客,再用聚合函数统计存活数和总人数,最后计算比例并保留两位小数:
SELECT class, ROUND(100 * SUM(CASE WHEN survived = 'yes' THEN 1 ELSE 0 END) / COUNT(*), 2) AS survival_rate FROM Titanic GROUP BY class;
SUM(CASE WHEN survived = 'yes' THEN 1 ELSE 0 END):统计每个舱位的存活人数COUNT(*):统计每个舱位的总乘客数ROUND(..., 2):把计算结果保留两位小数
方法二:用子查询先获取各舱位总人数,再关联计算
如果你更习惯分步计算,可以先通过子查询得到每个舱位的总人数,再和原表关联统计存活数:
SELECT t.class, ROUND(100 * COUNT(s.survived) / t.total, 2) AS survival_rate FROM ( -- 先算出每个舱位的总人数 SELECT class, COUNT(*) AS total FROM Titanic GROUP BY class ) t -- 左连接存活的乘客记录 LEFT JOIN Titanic s ON t.class = s.class AND s.survived = 'yes' GROUP BY t.class, t.total;
这两种方法都能正确返回每个舱位的存活率,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Valerio Catalano
相关产品推荐
相关产品推荐

