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

同表内匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:48:01