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
相关产品推荐
相关产品推荐

