求助:同一Operation_Seq_Number下合并物料序列的SQL实现
SQL分组合并物料序列问题求助
现有表包含字段:Header Number、Operation_Seq_Number、Material_Seq_Number、Material_item_id,以及物料数量字段(假设为MATERIAL_QUANTITY)。
需求:在同一Operation_Seq_Number下,若同一个Material_item_id对应多个不同的Material_Seq_Number,需要合并这些物料序列——保留最小的Material_Seq_Number(比如示例中的114),同时对这些序列的数量求和,最终只保留合并后的行,删除其他物料序列的行。
本人尝试了以下SQL但未达预期:
SELECT HEADER_NUMBER, WO_OPERATION_SEQ_NUMBER, MATERIAL_SEQ_NUMBER, MATERIAL_ITEM_NUMBER, MATERIAL_QUANTITYs FROM xx GROUP BY MATERIAL_ITEM_NUMBER ORDER BY MATERIAL_SEQ_NUMBER ASC
你的SQL存在的问题
- 分组维度错误:需求是按工单头+工序+物料id分组,你只按
Material_item_id分组,会把不同工序下的同物料id错误合并,不符合需求。 - 聚合逻辑缺失:数量需要求和,
Material_Seq_Number需要保留最小值,你直接选取原字段会导致分组后值不确定(不同数据库处理规则不同)。 - 字段名不一致:原表字段是
Operation_Seq_Number,你SQL里写的是WO_OPERATION_SEQ_NUMBER,属于笔误。
正确查询SQL
如果只是需要查询合并后的结果,用以下语句:
SELECT HEADER_NUMBER, Operation_Seq_Number, MIN(Material_Seq_Number) AS Material_Seq_Number, -- 保留最小的物料序列 Material_item_id, SUM(MATERIAL_QUANTITY) AS MATERIAL_QUANTITY -- 对数量求和 FROM xx GROUP BY HEADER_NUMBER, Operation_Seq_Number, Material_item_id -- 按需求的分组维度聚合 ORDER BY Operation_Seq_Number, Material_Seq_Number ASC;
删除原表多余行的SQL(以MySQL为例)
如果需要直接删除原表中不需要的行,保留合并后的记录,可以用关联子查询的方式:
DELETE t1 FROM xx t1 JOIN ( -- 先找出每个分组下需要保留的最小物料序列 SELECT HEADER_NUMBER, Operation_Seq_Number, Material_item_id, MIN(Material_Seq_Number) AS keep_seq FROM xx GROUP BY HEADER_NUMBER, Operation_Seq_Number, Material_item_id ) t2 ON t1.HEADER_NUMBER = t2.HEADER_NUMBER AND t1.Operation_Seq_Number = t2.Operation_Seq_Number AND t1.Material_item_id = t2.Material_item_id AND t1.Material_Seq_Number != t2.keep_seq;
内容的提问来源于stack exchange,提问作者Jeremy Reynolds
相关产品推荐
相关产品推荐

