T-SQL多条件CASE语句实现员工岗位等级分组查询问题
问题解答
报错原因
你执行的SQL报错是因为 GROUP BY 按职位(Designation)分组后,SELECT 列表中的Grade字段既没有包含在GROUP BY子句中,也没有被聚合函数包裹,SQL Server无法确定分组后要返回同职位下的哪一个Grade值,因此抛出无效列错误。
正确T-SQL语句
按照你给出的三条查询规则,以下语句可以得到期望结果:
SELECT Designation, CASE -- 规则3优先级最高:仅同时存在A、B且无其他Grade时返回A WHEN COUNT(DISTINCT Grade) = 2 AND SUM(CASE WHEN Grade = 'A' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN Grade = 'B' THEN 1 ELSE 0 END) > 0 THEN 'A' -- 规则2:仅一个Grade直接返回 WHEN COUNT(DISTINCT Grade) = 1 THEN MAX(Grade) -- 规则1:多个Grade返回MultiGrade ELSE 'MultiGrade' END AS Grade FROM #EmployeeData GROUP BY Designation
结果验证
执行上述语句后,输出和你期望的结果完全一致:
| Designation | Grade |
|---|---|
| Manager | MultiGrade |
| SeniorTeamLead | A |
| TeamLead | MultiGrade |
逻辑说明
- 用聚合函数
COUNT(DISTINCT Grade)统计每个职位对应的不同等级数量,避免了非分组字段的引用错误 - 优先判断是否仅存在A、B两个等级,满足则直接返回A
- 其次判断是否仅存在单个等级,用
MAX(Grade)取唯一的等级值返回 - 其余情况都返回
MultiGrade
内容的提问来源于stack exchange,提问作者Madhu
相关产品推荐
相关产品推荐

