p分组加权平均 SUM(值 * 权重) / NULLIF(SUM(权重), 0)需在 GROUP BY 下按组分别计算分子分母权重为NULL时SUM自动忽略应显式过滤或处理避免重复SUM影响性能。/p用 SUM() 和除法算分组加权平均核心是别漏乘权重直接说结论分组加权平均 SUM(值 * 权重) / SUM(权重)必须在 GROUP BY 下对每组分别算这两个和。常见错误是只写 AVG(值 * 权重) 或忘了分母也要 SUM()结果完全不对。比如计算每个部门的「平均绩效得分」但得分要按员工职级初级/中级/高级加权——这时不能用 AVG(score)也不能写成 AVG(score * weight)因为后者会把加权后的值再取算术平均丢失原始权重比例。SUM(score * weight) 是总加权分必须用这个做分子分母必须是 SUM(weight)不是 COUNT(*) 或 SUM(1)否则权重归一化就失效如果某组所有 weight 为 0 或 NULLSUM(weight) 为 0除零会报错或返回 NULL得加 NULLIF 防御防除零用 NULLIF() 包住分母数据库遇到除零不会自动跳过MySQL 返回 NULL但行为不一致PostgreSQL 直接报错 division by zeroSQL Server 报 Msg 8134。所以分母必须显式处理。正确写法是SUM(score * weight) / NULLIF(SUM(weight), 0)。这样当分母为 0 时整条表达式返回 NULL不影响其他组计算。别用 CASE WHEN SUM(weight) 0 THEN NULL ELSE ... END多写三行还容易漏 ELSENULLIF(a, b) 是标准 SQL 函数所有主流数据库都支持比自定义逻辑更可靠如果业务上要求返回 0 而非 NULL再套一层 COALESCE(..., 0)但注意 0 可能掩盖数据异常权重含 NULL 时SUM() 自动忽略但你要知道它被忽略了SUM() 遇到 NULL 值默认跳过不报错也不警告。这看起来省心但容易埋坑比如某员工的 weight 是 NULL那他的 score 就彻底不参与计算——既没进分子也没进分母。这不一定是错但得确认是否符合业务预期。例如职级未填写的员工该不该计入部门加权平均 AI智研社 AI智研社是一个专注于人工智能领域的综合性平台