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

SQL存储过程CASE WHEN中如何按Iteration列分别执行关联列计算?

问题解决方法

你完全可以实现按每个Iteration值分别计算、生成对应两行结果的需求,报错根因就是子查询未过滤Iteration维度,以下是优化后的实现方案:

核心调整逻辑

不用写多层嵌套子查询,改用条件聚合实现会更简洁高效,同时自动适配Iteration维度:

  1. 保留GROUP BY中的Iteration字段,分组时自动按ProjectID + Iteration拆分维度,每个Iteration单独计算
  2. 用CASE WHEN + 聚合函数提取当前分组下对应Tag的Total值,避免子查询返回多行的问题
  3. 除数为0时依旧返回NULL,兼容原有逻辑

修改后的INSERT语句

替换原有INSERT INTO #TT_TotalTauxTauxAssist的整段SELECT逻辑即可:

INSERT INTO #TT_TotalTauxTauxAssist 
SELECT  
    'IQ3.2-05' AS Code,
    (SELECT Label FROM dbo.IND_IndicatorsThresholdWeighting WHERE Code = 'IQ3.2-05') AS Label,
    CASE WHEN 
        ISNULL(MAX(CASE WHEN TTA.Tag = 'DEMANDE' THEN TTA.Total END),0) 
        - ISNULL(MAX(CASE WHEN TTA.Tag = 'ABANDON' THEN TTA.Total END),0) 
        - ISNULL(MAX(CASE WHEN TTA.Tag = 'ATTENTE' THEN TTA.Total END),0) = 0 
    THEN NULL 
    ELSE 
        ISNULL(MAX(CASE WHEN TTA.Tag = 'HD' THEN TTA.Total END),0)
        / (
            ISNULL(MAX(CASE WHEN TTA.Tag = 'DEMANDE' THEN TTA.Total END),0) 
            - ISNULL(MAX(CASE WHEN TTA.Tag = 'ABANDON' THEN TTA.Total END),0) 
            - ISNULL(MAX(CASE WHEN TTA.Tag = 'ATTENTE' THEN TTA.Total END),0)
        )
    END AS Total,
    dbo.StrConcat([Keys]),
    TTA.ProjectID,
    TTA.Iteration,
    TTA.StartDate,
    TTA.EndDate
FROM #TT_TAUX TTA
JOIN dbo.JIRA_Projects JI ON JI.ID = TTA.ProjectID
WHERE (@ProjectID = -1 OR JI.ID = @ProjectId)
GROUP BY TTA.ProjectID, JI.ID, TTA.Iteration, TTA.StartDate, TTA.EndDate

注意事项

  • 原有GROUP BY中的TTA.Total字段已经删除,因为我们用聚合函数计算Total,不需要把它放进分组维度
  • 如果需要兼容Tag缺失的场景,可自行调整ISNULL的默认值,比如把缺省的0改成你需要的默认取值
  • 执行后会自动为每个Iteration生成一行计算结果,不需要额外加循环或者过滤条件

内容的提问来源于stack exchange,提问作者2G1P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:30:05