同表内匹配PatID/FacID/NDC合并RXBatch数据并清零原字段的SQL问题
解决SQL合并字段并清零的问题
我来帮你搞定这个问题!你的需求很明确:把RXBatch = 'Test1'的Qty和Dayssupply字段值,按PatID、FacID、NDC匹配合并到RXBatch = 'Test2'的对应记录中,之后把Test1的这两个字段置为0。当前脚本只完成了Qty的累加,漏掉了Dayssupply的更新和Test1字段的清零,下面给你完整的解决方案:
方案1:通用版(处理所有Test1记录,无论是否有匹配的Test2)
这个方案会先计算Test1中每个匹配组的字段总和,更新到Test2,再将所有Test1的对应字段清零:
BEGIN TRANSACTION; -- 用事务保证操作原子性,出错可以回滚 -- 第一步:计算Test1中每个PatID/FacID/NDC组合的Qty和Dayssupply总和 WITH Test1Totals AS ( SELECT FacID, PatID, NDC, SUM(Qty) AS TotalQty, SUM(Dayssupply) AS TotalDaysSupply FROM FWDB.RX.RXS WHERE RXBatch = 'Test1' GROUP BY FacID, PatID, NDC ) -- 第二步:更新Test2的对应字段,把Test1的总和加进去 UPDATE RXS SET Qty = RXS.Qty + T.TotalQty, Dayssupply = RXS.Dayssupply + T.TotalDaysSupply FROM FWDB.RX.RXS RXS INNER JOIN Test1Totals T ON RXS.FacID = T.FacID AND RXS.PatID = T.PatID AND RXS.NDC = T.NDC WHERE RXS.RXBatch = 'Test2'; -- 第三步:把所有Test1的Qty和Dayssupply置为0 UPDATE FWDB.RX.RXS SET Qty = 0, Dayssupply = 0 WHERE RXBatch = 'Test1'; -- 确认数据正确后再提交,否则执行ROLLBACK TRANSACTION; COMMIT TRANSACTION;
方案2:仅处理有匹配Test2的Test1记录
如果你的需求是只合并那些有对应Test2记录的Test1数据,并只清零这些Test1记录,可以调整成下面的写法,避免处理无匹配的Test1数据:
BEGIN TRANSACTION; -- 先筛选出有对应Test2的Test1组,并计算总和 WITH Test1ToMerge AS ( SELECT t1.FacID, t1.PatID, t1.NDC, SUM(t1.Qty) AS TotalQty, SUM(t1.Dayssupply) AS TotalDaysSupply FROM FWDB.RX.RXS t1 INNER JOIN FWDB.RX.RXS t2 ON t1.FacID = t2.FacID AND t1.PatID = t2.PatID AND t1.NDC = t2.NDC AND t2.RXBatch = 'Test2' WHERE t1.RXBatch = 'Test1' GROUP BY t1.FacID, t1.PatID, t1.NDC ) -- 更新匹配的Test2记录 UPDATE t2 SET Qty = t2.Qty + tm.TotalQty, Dayssupply = t2.Dayssupply + tm.TotalDaysSupply FROM FWDB.RX.RXS t2 INNER JOIN Test1ToMerge tm ON t2.FacID = tm.FacID AND t2.PatID = tm.PatID AND t2.NDC = tm.NDC WHERE t2.RXBatch = 'Test2'; -- 只清零那些有对应Test2的Test1记录 UPDATE t1 SET Qty = 0, Dayssupply = 0 FROM FWDB.RX.RXS t1 INNER JOIN Test1ToMerge tm ON t1.FacID = tm.FacID AND t1.PatID = tm.PatID AND t1.NDC = tm.NDC WHERE t1.RXBatch = 'Test1'; COMMIT TRANSACTION;
关键说明
- 用
WITH子句(CTE)先计算总和,避免重复扫描表,提升效率; - 包裹事务是为了保证两个更新操作要么都成功,要么都失败,防止数据不一致;
- 原脚本的问题是只处理了
Qty字段,没涉及Dayssupply,也没有对Test1执行清零操作,上面的方案补全了这两部分。
内容的提问来源于stack exchange,提问作者MakesReal
相关产品推荐
相关产品推荐

