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

基于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]

代码逻辑拆解

  1. CTE部分:先把不同的CONTRACTTYPE统一转换成Contract或Deemed两种状态,这里不提前分组,目的是保留每个客户的所有状态记录,这样才能判断该客户是否存在多种状态。
  2. 主查询部分:
    • 按DEBTORID和DEBTOR分组,确保同一个客户只出现在一条结果里
    • 用COUNT(DISTINCT [Contract])统计该客户的状态种类数:
      • 如果数量大于1,说明同时存在多种状态,显示Mixed
      • 如果数量等于1,说明只有一种状态,用MAX([Contract])取出该唯一状态

原代码的问题说明

你原来的CTE里加了GROUP BY [DEBTORID],[DEBTOR],[CONTRACTTYPE],这会把同一个客户的不同状态拆分成多条记录,后续再分组也无法合并成单条。去掉这个分组,把状态判断和合并逻辑放在主查询的分组里,就能解决问题了。

内容的提问来源于stack exchange,提问作者Russell Templar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:37:31