SQL存储过程CASE WHEN中如何按Iteration列分别执行关联列计算?
问题解决方法
你完全可以实现按每个Iteration值分别计算、生成对应两行结果的需求,报错根因就是子查询未过滤Iteration维度,以下是优化后的实现方案:
核心调整逻辑
不用写多层嵌套子查询,改用条件聚合实现会更简洁高效,同时自动适配Iteration维度:
- 保留GROUP BY中的Iteration字段,分组时自动按
ProjectID + Iteration拆分维度,每个Iteration单独计算 - 用
CASE WHEN + 聚合函数提取当前分组下对应Tag的Total值,避免子查询返回多行的问题 - 除数为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
相关产品推荐
相关产品推荐

