SQL按指定条件统计用户有效PaidMonths总和的实现方案咨询
实现方案
不需要使用临时表,单条查询即可完成,逻辑简洁同时性能最优。
核心逻辑是通过CASE WHEN条件表达式按优先级处理单条支付记录的有效月数,再关联用户表分组求和即可,规则判断优先级如下:
- 优先判断退款状态:
Refunded = 1时有效月数直接取0 - 再判断支付金额:
ValuePaid < 10时有效月数固定取0.23 - 其余场景直接取原表
PaidMonths字段值
兼容主流数据库的SQL代码
SELECT u.Userid, u.Name, SUM( CASE WHEN p.Refunded = 1 THEN 0 WHEN p.ValuePaid < 10 THEN 0.23 ELSE p.PaidMonths END ) AS paidMonths FROM users u LEFT JOIN payments p ON u.Userid = p.Userid GROUP BY u.Userid, u.Name ORDER BY u.Userid ASC;
补充说明
- 用
LEFT JOIN可以保证没有支付记录的用户也能出现在结果中,若只需统计有支付记录的用户,可替换为INNER JOIN CASE WHEN的判断顺序严格匹配规则要求,计算结果和预期输出完全一致- 不需要额外的临时表、嵌套子查询,当前写法的可读性和执行效率都是最优的
内容的提问来源于stack exchange,提问作者UcanDoIt
相关产品推荐
相关产品推荐

