PostgreSQL中如何按条件对多列分别求和并计算总计?
解决月度分钟数按±10%范围求和的SQL逻辑错误
你的问题出在CASE WHEN的条件逻辑完全写反了:
以my_minutes=225为例,±10%的范围是202.5(0.9×225)到247.5(1.1×225),但你写的是month_01_minutes <= 202.5 AND month_01_minutes >=247.5——没有任何数值能同时满足这两个矛盾条件,所以所有行都返回0,求和结果自然为0。
纠正后的单列求和SQL
SELECT SUM(CASE WHEN c.month_01_minutes >= 0.9 * 225 AND c.month_01_minutes <= 1.1 * 225 THEN c.month_01_minutes ELSE 0 END) AS month_01_total FROM fumes_schema.consumption c WHERE c.aircraft_type = 'xyz';
扩展到12个月的完整方案(含总计)
如果要处理所有月度字段并计算总计,可以复用逻辑,也可以用更直观的绝对值判断避免上下限写反:
SELECT -- 月度求和(用绝对值判断更简洁) SUM(CASE WHEN ABS(c.month_01_minutes - my_minutes) <= 0.1 * my_minutes THEN c.month_01_minutes ELSE 0 END) AS month_01_total, SUM(CASE WHEN ABS(c.month_02_minutes - my_minutes) <= 0.1 * my_minutes THEN c.month_02_minutes ELSE 0 END) AS month_02_total, -- ... 重复上述逻辑到month_12_minutes SUM(CASE WHEN ABS(c.month_12_minutes - my_minutes) <= 0.1 * my_minutes THEN c.month_12_minutes ELSE 0 END) AS month_12_total, -- 计算所有月度的总计 SUM( CASE WHEN ABS(c.month_01_minutes - my_minutes) <= 0.1 * my_minutes THEN c.month_01_minutes ELSE 0 END + CASE WHEN ABS(c.month_02_minutes - my_minutes) <= 0.1 * my_minutes THEN c.month_02_minutes ELSE 0 END + -- ... 依次加完12个月的CASE表达式 CASE WHEN ABS(c.month_12_minutes - my_minutes) <= 0.1 * my_minutes THEN c.month_12_minutes ELSE 0 END ) AS grand_total FROM fumes_schema.consumption c WHERE c.aircraft_type = 'xyz';
内容的提问来源于stack exchange,提问作者ryan6627
相关产品推荐
相关产品推荐

