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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:10:30