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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:06:02