Sql-server – Query to update one column of a table based on a column of a different table

queryquery-performancesql-server-2016t-sqlupdate

I have two tables with below structure :

Create table Customer_info
(Customer_num  varchar(50),
 Customer_Branch  int);

Create table Customer_Transaction_Info
(Customer_num     varchar(50),
 Branch_Code      int,
 Trns_Measure_One int,
 Trns_Measure_Two int
 );

Sample data for each table:

insert into Customer_info(Customer_num , Customer_Branch)
values('A',1),
      ('B',2),
      ('C',3);

   Customer_num     Customer_Branch
------------------- ---------------
     A                      1
     B                      2
     C                      3

insert into Customer_Transaction_Info (Customer_num,Branch_Code,Trns_Measure_One,Trns_Measure_Two)
Values ('A',1,10,0),
       ('A',2,20,5),
       ('A',3,14,0),
       ('B',2,10,10),
       ('B',1,36,0),
       ('C',3,14,0),
       ('C',1,10,18);

 Customer_num    Branch_Code Trns_Measure_One Trns_Measure_Two
 --------------- ----------- ----------------  ---------------
    A               1           10               0
    A               2           20               5
    A               3           14               0
 -------------------------------------------------------------
    B               2           10               10
    B               1           36               0
 -------------------------------------------------------------
    C               3           14               0
    C               1           10               18

What I need to do is this:

  1. For each Customer_num in Customer_Transaction_Info , Trns_Measure_Two must be assigned to the correct Branch_Code for that customer which is the one in the first table , Customer_info

  2. For each Customer_num in Customer_Transaction_Info, Trns_Measure_Two must be updated to 0 for incorrect branches.

So based on these the desired result is below:

 Customer_num    Branch_Code Trns_Measure_One Trns_Measure_Two
 --------------- ----------- ----------------  ---------------
    A               1           10               0---> Update to 5
    A               2           20               5---> Update to 0
    A               3           14               0
 -------------------------------------------------------------
    B               2           10               10---> This record is Correct
    B               1           36               0
 -------------------------------------------------------------
    C               3           14               0 ---> Update to 18
    C               1           10               18---> Update to 0

We must take these facts into consideration that:

  1. There's only one Customer_Branch for each Customer_num in Customer_info table.
  2. There's only one non-zero Trns_Measure_Two for each Customer_num in Customer_Transaction_Info

Thanks in advance

Best Answer

UPDATE Customer_Transaction_Info
SET Trns_Measure_Two = subquery.Trns_Measure_Two
FROM (SELECT cti.Customer_num, cti.Branch_Code, cti.Trns_Measure_One,
             CASE WHEN ci.Customer_Branch = cti.Branch_Code
                  THEN MAX(cti.Trns_Measure_Two) OVER (PARTITION BY cti.Customer_num)
                  ELSE 0
                  END Trns_Measure_Two
      FROM Customer_info ci
      JOIN Customer_Transaction_Info cti ON ci.Customer_num = cti.Customer_num) subquery
WHERE Customer_Transaction_Info.Customer_num = subquery.Customer_num
  AND Customer_Transaction_Info.Branch_Code = subquery.Branch_Code

fiddle