SQL中CASE+MAX分组后添加ORDER BY出现NULL的原因解析
问题原因分析
你遇到的大量NULL值问题,核心是GROUP BY分组逻辑的变化:
最初仅按
evolution_line分组时,同一条进化线的所有宝可梦行被合并为一个分组。比如妙蛙种子、妙蛙草、妙蛙花会被归为同一组,MAX(CASE)会遍历整个分组的所有行,提取每个进化阶段对应的非空值,最终一行就能完整展示三阶进化的全部信息。当你把
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
相关产品推荐
相关产品推荐

