Search code examples
t-sqlupsertssms-17

Update columns based on different criteria using merge statement


So I am using the following merge statement to do an update and insert in one of my tables, however I would like to update another column in the Target table in addition to the one already in the statement. I'm just not sure if I can do that or how to go about it. What I want to do is add in something like

when MATCHED and Source.EventType='Change' Then UPDATE SET Target.DEDCAMT_1 = Source.EmpDedAmt

Can I do that in the same Merge statement?

    MERGE dbo.BENTBL as Target
    using dbo.BenPaycdUpdate as Source
    ON Source.EmpID = Target.EMPLOYID AND Source.Paycode = Target.DEDUCTON
    WHEN MATCHED AND source.EventType='Stop'
    THEN UPDATE
    SET INACTIVE = '1',
    Target.DEDENDDT = Source.AsOfDate
    WHEN NOT MATCHED BY Target
    AND Source.PayCode <> 'FSAH' 
    THEN INSERT (EMPLOYID, DEDUCTON, INACTIVE, DEDBEGDT, DEDCAMNT_1)
    VALUES (Source.EmpID, Source.Paycode,'0', Source.AsofDate,
    CAST(REPLACE  (REPLACE(ISNULL(source.EmpDed,0),',',''),'$','') AS numeric(19,5)));

Solution

  • You can move the condition from the merge to a case expression, like this:

    MERGE dbo.BENTBL as Target
    using dbo.BenPaycdUpdate as Source
    ON Source.EmpID = Target.EMPLOYID AND Source.Paycode = Target.DEDUCTON
    WHEN MATCHED THEN 
    UPDATE
    SET INACTIVE = CASE WHEN source.EventType = 'Stop' THEN '1' ELSE INACTIVE END,
        Target.DEDCAMT_1 = CASE WHEN source.EventType = 'Change' THEN Source.EmpDedAmt ELSE Target.DEDCAMT_1 END,
        Target.DEDENDDT = Source.AsOfDate
    WHEN NOT MATCHED BY Target AND Source.PayCode <> 'FSAH' THEN 
    INSERT (EMPLOYID, DEDUCTON, INACTIVE, DEDBEGDT, DEDCAMNT_1)
    VALUES (Source.EmpID, Source.Paycode,'0', Source.AsofDate,
    CAST(REPLACE  (REPLACE(ISNULL(source.EmpDed,0),',',''),'$','') AS numeric(19,5)));