重复物料编号统一显示‘Working on It’状态的SQL实现问题
解决方案
首先修正你的SQL逻辑,解决状态未统一的问题:
SELECT SUBSTRING(item, 1, 4) AS Item, CASE WHEN has_working = 1 THEN 'Working on It' ELSE [Eng Status] END AS Status FROM ( SELECT item, [Eng Status], -- 按物料编号分组,标记是否存在"Working on It"状态 MAX(CASE WHEN [Eng Status] = 'Working on It' THEN 1 ELSE 0 END) OVER (PARTITION BY SUBSTRING(item, 1, 4)) AS has_working FROM tbl ) AS sub_query
如果需要去重(避免同一物料+状态的重复记录),可以在外层添加DISTINCT:
SELECT DISTINCT SUBSTRING(item, 1, 4) AS Item, CASE WHEN has_working = 1 THEN 'Working on It' ELSE [Eng Status] END AS Status FROM ( SELECT item, [Eng Status], MAX(CASE WHEN [Eng Status] = 'Working on It' THEN 1 ELSE 0 END) OVER (PARTITION BY SUBSTRING(item, 1, 4)) AS has_working FROM tbl ) AS sub_query
原SQL的问题分析
- 别名引用限制:部分数据库(如SQL Server)不允许在窗口函数的
PARTITION BY中直接引用SELECT列表的别名Item,必须使用实际的字段表达式SUBSTRING(item, 1, 4)。 - 状态替换不彻底:原SQL的ELSE分支直接返回原始状态
[Eng Status],导致即使物料存在"Working on It"状态,原本的"On Hold"记录依然会保留该状态,加上DISTINCT后还是会出现两种状态,和原数据一致。 - 分层处理缺失:先通过子查询计算每个物料的状态标记,再在外层统一替换所有该物料的状态,才能保证同一物料的所有记录状态统一。
内容的提问来源于stack exchange,提问作者Rakshith
相关产品推荐
相关产品推荐

