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

Cache数据库SQL查询问题:聚合数据仅单行列生效

Cache数据库UNION查询聚合值异常排查与优化

问题核心

UNION拼接的结果里只有PROPS DECISIONED行的聚合数据正常,其余行数值全为0,同时需要扩展更多CASE条件处理不同状态。

排查与修正步骤

  • 检查CASE条件与UNION分支的匹配度
    每个UNION分支的状态描述(比如'PENDING REVIEW')必须和聚合计算里的CASE判断严格对应,包括字符串大小写、空格、拼写。比如如果分支写的是'PENDING REVIEW',但CASE里判断的是WHEN status = 'PendingReview',就会匹配失败返回0。

  • 验证JOIN关联逻辑
    确认JOIN的ON条件没有过滤掉其他状态的记录,必要时把INNER JOIN改成LEFT JOIN,保证所有状态的基础数据都能被纳入聚合计算。

  • 拆分UNION分支单独测试
    把每个UNION分支单独执行,先看基础数据是否存在。比如单独查SELECT SUM(amount) FROM table1 WHERE status = 'PENDING REVIEW',如果有非0结果但聚合后为0,说明CASE或关联逻辑出了问题。

  • 优化CASE条件的扩展性
    别用多个UNION重复写查询,改成GROUP BY状态的方式,更易维护也能避免逻辑冲突,示例如下:

    SELECT 
      CASE t.status 
        WHEN 'DECIDED' THEN 'PROPS DECISIONED'
        WHEN 'REVIEW' THEN 'PENDING REVIEW'
        WHEN 'IN_PROGRESS' THEN 'IN PROGRESS'
        -- 在这里新增更多状态映射
        ELSE 'UNDEFINED'
      END AS status_desc,
      SUM(t.amount) AS total_amount
    FROM table1 t
    LEFT JOIN table2 r ON t.id = r.tid
    GROUP BY status_desc
    

常见错误示例(对应问题场景)

很多时候问题出在UNION分支的CASE条件写错,比如:

-- 错误写法:所有分支都判断status='DECIDED'
SELECT 'PROPS DECISIONED' AS status_desc, SUM(CASE WHEN t.status = 'DECIDED' THEN t.amount ELSE 0 END) AS total
FROM table1 t JOIN table2 r ON t.id = r.tid
UNION
SELECT 'PENDING REVIEW' AS status_desc, SUM(CASE WHEN t.status = 'DECIDED' THEN t.amount ELSE 0 END) AS total
FROM table1 t JOIN table2 r ON t.id = r.tid

修正后应该让每个分支的CASE对应自身的状态:

SELECT 'PROPS DECISIONED' AS status_desc, SUM(CASE WHEN t.status = 'DECIDED' THEN t.amount ELSE 0 END) AS total
FROM table1 t JOIN table2 r ON t.id = r.tid
UNION
SELECT 'PENDING REVIEW' AS status_desc, SUM(CASE WHEN t.status = 'REVIEW' THEN t.amount ELSE 0 END) AS total
FROM table1 t JOIN table2 r ON t.id = r.tid

内容的提问来源于stack exchange,提问作者Amey Banaye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:49:50