如何使用SELECT CASE与别名实现总里程的聚合求和输出?
解决方法:将CASE逻辑嵌入SUM内部实现单一总里程汇总
你的问题出在把CASE放在SUM外面并按dist_is_duration分组,这会把数据分成两组分别计算总和,所以得到两个结果。要获取单一总里程,需要把CASE判断逻辑移到SUM函数内部,让每一行数据先根据dist_is_duration计算出对应的里程贡献,再把所有行的贡献汇总成一个总和。
修正后的查询语句
SELECT ROUND(SUM( CASE WHEN d.dist_is_duration = 1 THEN s.activity_steps * d.dist_activity_duration / 2000 WHEN d.dist_is_duration = 0 THEN d.dist_activity_duration END ), 2) AS total_miles FROM distance d JOIN activities a ON a.id = d.dist_activity_id JOIN steps s ON s.id = a.steps_id JOIN members AS m ON d.member_id = m.id AND m.id = ?
逻辑说明
- 对每一行
distance记录,根据dist_is_duration的值计算该行对应的里程:- 当
dist_is_duration=1时,用原公式计算里程:s.activity_steps * d.dist_activity_duration / 2000 - 当
dist_is_duration=0时,直接使用已有的英里值:d.dist_activity_duration
- 当
- 用SUM函数把所有行的里程贡献加起来,最后用ROUND保留两位小数,得到单一的总里程数值。
- 去掉了
GROUP BY d.dist_is_duration,因为我们不需要分组统计,而是要全局汇总。
这样执行后,就能得到你想要的单一汇总总里程,而不是分组后的两个结果。
内容的提问来源于stack exchange,提问作者user1809642
相关产品推荐
相关产品推荐

