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

SQL中CASE+MAX分组后添加ORDER BY出现NULL的原因解析

问题原因分析

你遇到的大量NULL值问题,核心是GROUP BY分组逻辑的变化:

  1. 最初仅按evolution_line分组时,同一条进化线的所有宝可梦行被合并为一个分组。比如妙蛙种子、妙蛙草、妙蛙花会被归为同一组,MAX(CASE)会遍历整个分组的所有行,提取每个进化阶段对应的非空值,最终一行就能完整展示三阶进化的全部信息。

  2. 当你把pokedex_num加入GROUP BY后,分组键变成了evolution_line + pokedex_num。由于每个宝可梦的pokedex_num是唯一标识,此时每个分组会缩小为进化线里的单条宝可梦记录——比如妙蛙种子单独成组、妙蛙草单独成组、妙蛙花单独成组。

    对这种单条记录的分组来说,CASE语句只会匹配当前宝可梦对应的进化阶段(比如妙蛙种子的分组里,只有一阶进化的CASE有值,二阶、三阶全为NULL)。MAX()函数在只有一个非空值和多个NULL的组里,只能保留那个非空值,其余列自然都是NULL。最终结果就变成每个宝可梦占一行,仅对应进化阶段的列有值,其余全为空。

如果想按pokedex_num排序同时保持进化线合并成一行的效果,不要把pokedex_num加入GROUP BY,而是在仅按evolution_line分组的基础上,用该进化线的最小/最大pokedex_num来排序,示例SQL如下:

SELECT 
  evolution_line,
  MAX(CASE WHEN stage = 1 THEN pokemon_name END) AS stage1,
  MAX(CASE WHEN stage = 2 THEN pokemon_name END) AS stage2,
  MAX(CASE WHEN stage = 3 THEN pokemon_name END) AS stage3,
  MIN(pokedex_num) AS line_start_pokedex
FROM evolution_table
GROUP BY evolution_line
ORDER BY line_start_pokedex;

内容的提问来源于stack exchange,提问作者Alexander Espiritu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:17:05