SQL Server中如何在Group By子句中使用Case实现条件分组?
需求实现方案
错误点说明
原写法不成立的核心原因是:GROUP BY 子句不支持通过 CASE 分支动态选择不同的分组语法,只能通过条件表达式生成统一的分组键来实现动态分组逻辑。
正确实现代码
SELECT SUM(PROSPECTS) AS TOTAL_PROSPECTS, -- 输出对应的分组维度值 CASE WHEN MARQUE IN (0,16,30,36) THEN CAST(MARQUE AS VARCHAR(10)) ELSE LANGUAGE END AS GROUP_KEY, -- 标记当前行的分组维度,不需要可以删除 CASE WHEN MARQUE IN (0,16,30,36) THEN 'MARQUE' ELSE 'LANGUAGE' END AS GROUP_DIMENSION, -- 如需保留原始字段值可保留以下两行,不需要可以删除 MARQUE, LANGUAGE FROM USERS GROUP BY -- 核心分组逻辑,和SELECT层的分组键逻辑完全一致 CASE WHEN MARQUE IN (0,16,30,36) THEN CAST(MARQUE AS VARCHAR(10)) ELSE LANGUAGE END, -- 和SELECT里要返回的非聚合字段对应,不需要返回MARQUE、LANGUAGE可删除 MARQUE, LANGUAGE
注意事项
- 代码中将MARQUE转成字符串类型是为了和LANGUAGE的字符串类型统一,避免类型转换报错
- 如果按LANGUAGE分组时不需要展示同组下所有的MARQUE值,可删除GROUP BY和SELECT里的MARQUE、LANGUAGE字段,避免同LANGUAGE不同MARQUE被拆分成多行
- 如果希望按MARQUE分组时LANGUAGE字段显示空、按LANGUAGE分组时MARQUE显示空,可在SELECT层对两个字段加CASE判断即可:
CASE WHEN MARQUE IN (0,16,30,36) THEN MARQUE END AS MARQUE, CASE WHEN MARQUE NOT IN (0,16,30,36) THEN LANGUAGE END AS LANGUAGE
内容的提问来源于stack exchange,提问作者user105780
相关产品推荐
相关产品推荐

