如何编写SQL查询按指定规则检索不同客户的状态?
原SQL问题分析
你原有写法的核心问题是仅对「客户+状态」的组合做去重,会返回同一客户的所有不同状态,无法实现“优先返回非completed状态,客户所有状态均为completed才返回completed”的聚合规则。
调整后方案
按客户维度分组,通过聚合判断优先取非completed状态即可,SQL语句如下:
SELECT CustomName AS 客户姓名, COALESCE( -- 优先级1:取created状态 MAX(CASE WHEN STATUS = 'created' THEN STATUS END), -- 优先级2:取inprocess状态 MAX(CASE WHEN STATUS = 'inprocess' THEN STATUS END), -- 无上述状态则返回completed 'completed' ) AS 状态 FROM [dbo].[Customers] GROUP BY CustomName
逻辑说明
- 用
GROUP BY CustomName把数据按客户聚合,每个客户仅返回一行结果 - 用
CASE语句匹配高优先级的非completed状态,MAX聚合会自动跳过CASE匹配不到返回的NULL值 - 用
COALESCE函数按优先级取第一个非空的状态值,所有非completed状态都不存在时默认返回completed
运行上述语句即可得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Mariyan
相关产品推荐
相关产品推荐

