基于ID计数的SQL查询需求:合并客户合同状态显示
解决客户签约状态合并问题
先明确你的核心需求:
- 若客户ID仅对应一种签约状态,直接保留该状态
- 若同一客户ID同时存在多种签约状态,合并为单条记录,Contract字段显示
Mixed
修正后的SQL代码
WITH T AS ( SELECT [DEBTORID], [DEBTOR], -- 统一映射Contract状态 CASE WHEN [CONTRACTTYPE] IN ('KAM', 'SME', 'CCS') THEN 'Contract' ELSE 'Deemed' END AS 'Contract' FROM [FinancialReporting].[dbo].[LiveGasMeters] -- 这里不需要提前按CONTRACTTYPE分组,要保留每个客户的所有状态记录用于后续判断 ) SELECT [DEBTORID], [DEBTOR], -- 根据客户的状态种类数决定最终显示内容 CASE WHEN COUNT(DISTINCT [Contract]) > 1 THEN 'Mixed' ELSE MAX([Contract]) -- 状态唯一时取该值,用MIN也可以 END AS 'Contract' FROM T GROUP BY [DEBTORID], [DEBTOR]
代码逻辑拆解
- CTE部分:先把不同的
CONTRACTTYPE统一转换成Contract或Deemed两种状态,这里不提前分组,目的是保留每个客户的所有状态记录,这样才能判断该客户是否存在多种状态。 - 主查询部分:
- 按
DEBTORID和DEBTOR分组,确保同一个客户只出现在一条结果里 - 用
COUNT(DISTINCT [Contract])统计该客户的状态种类数:- 如果数量大于1,说明同时存在多种状态,显示
Mixed - 如果数量等于1,说明只有一种状态,用
MAX([Contract])取出该唯一状态
- 如果数量大于1,说明同时存在多种状态,显示
- 按
原代码的问题说明
你原来的CTE里加了GROUP BY [DEBTORID],[DEBTOR],[CONTRACTTYPE],这会把同一个客户的不同状态拆分成多条记录,后续再分组也无法合并成单条。去掉这个分组,把状态判断和合并逻辑放在主查询的分组里,就能解决问题了。
内容的提问来源于stack exchange,提问作者Russell Templar
相关产品推荐
相关产品推荐

