为什么sum(case)的放置位置会导致SQL查询结果出现差异?
两个查询结果差异的核心原因
1. 统计粒度完全不同
你的需求是「按天统计每个Genre对应的A占比」,两个查询的统计维度完全不一样:
- 查询1的逻辑完全匹配你的需求:
第一步先过滤出i_day = '2021-01-01'的所有数据,按Genre分组,对每个Genre分别统计:countA:该Genre下randomValue为A的总行数countB:该Genre下randomValue为B的总行数
最终返回的是每个Genre对应一行占比结果,有多少个不同的Genre就返回多少行。
- 查询2的统计逻辑和你的需求不匹配:
第一步先对全表按i_day、Genre、randomValue三个维度预聚合,过滤出指定日期的数据后,没有按Genre分组,直接把所有Genre的A总数、B总数分别求和,最终只返回1行「2021-01-01全天所有数据的整体A占比」。
2. 空值计算的潜在影响
如果某个Genre下只有A或者只有B,查询1中对应的countB或countA会返回NULL,countA + countB的计算结果也会是NULL,最终占比会返回空值。而查询2是全量加总,只要当天同时存在A和B的记录就不会出现这个问题,也会导致两边的输出结果看起来不一致。
对齐逻辑的修改方案
如果你确实需要每个Genre单独的占比,只需要调整查询2的cte2部分,加上GROUP BY Genre即可,调整后两个查询的结果会完全一致:
cte2 AS ( SELECT Genre, -- 新增返回Genre字段 SUM(CASE WHEN randomValue = 'A' THEN countCombination END) AS countA, SUM(CASE WHEN randomValue = 'B' THEN countCombination END) AS countB FROM cte WHERE i_day = '2021-01-01' GROUP BY Genre -- 新增按Genre分组 )
如果你实际需要的是指定日期全量数据的A占比,那查询2的结果是正确的,只需要调整查询1去掉GROUP BY Genre即可和查询2结果对齐。
内容的提问来源于stack exchange,提问作者Runeaway3
相关产品推荐
相关产品推荐

