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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:54:01