You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 06:37:32