So aktualisieren Sie mehrere Spalten mit Mehrfachbedingung

Ich muss mehrere Spalten in einer Tabelle mit mehreren Bedingungen aktualisieren.

Zum Beispiel ist dies meine Abfrage

update Table1 set weight= d.weight, stateweight=d.stateweight, overallweight=d.overallweight from (select * from table2)d where table1.state=d.state and table1.month=d.month and table1.year=d.year 

Wenn die Tabelle mit allen drei Spalten (Status, Monat, Jahr) übereinstimmt, sollte sie nur die Gewichtskalze aktualisieren und wenn sie übereinstimmt (Staat, Jahr), sollte sie nur die Statistik der Spalte aktualisieren und wenn sie mit (Jahr) übereinstimmt, sollte sie nur das Gesamtgewicht aktualisieren Säule

HINWEIS: Ich kann keine Update-Abfrage für jede Bedingung separat schreiben, weil es eine riesige select

Tabelle 1

 Year Month State Weight StateWeight Overweight 2014 1 AA 0.00 0.00 0.00 2014 3 AA 0.00 0.00 0.00 2014 1 AB 0.00 0.00 0.00 2014 2 AB 0.00 0.00 0.00 2014 3 AC 0.00 0.00 0.00 2014 1 DD 0.00 0.00 0.00 

Tabelle 2

 Year Month State Weight StateWeight Overweight 2014 1 AA 2.20 5.00 2.22 2014 2 AA 1.70 5.00 2.22 2014 3 AA 8.30 5.00 2.22 2014 1 AB 5.80 2.11 2.22 2014 2 AB 7.40 2.11 2.22 2014 3 AB 9.10 2.11 2.22 2014 1 AC 3.42 5.14 2.22 2014 1 DD 8.88 9.00 2.22 

Mein Ergebnis sollte sein (Meine aktualisierte Tabelle1 sollte sein)

 Year Month State Weight StateWeight Overweight 2014 1 AA 2.20 5.00 2.22 2014 3 AA 8.30 5.00 2.22 2014 1 AB 5.80 2.11 2.22 2014 2 AB 7.40 2.11 2.22 2014 3 AC 0.00 0.00 2.22 2014 1 DD 0.00 9.00 2.22 

aber die Abfrage, die du gegeben hast, wurde nur aktualisiert Übergewicht Spalte nicht andere 2 Spalte (Gewicht & StateWeight)

Sie können dies erreichen, indem Sie die Kriterien in Ihrer where-Klausel ändern und Hinzufügen von Case-statementen zum Update hinzufügen.

Hier ist ein Beispiel:

 with cte as ( select t1.Year, t1.Month, t1.State, Weight = MAX(case when t1.State = t2.State and t1.Month = t2.Month then t2.Weight else t1.Weight end), StateWeight = MAX(case when t1.State = t2.State and t1.Month = t2.Month then t2.StateWeight else t1.StateWeight end), Overweight = MAX(t2.Overweight) from Table1 as t1 inner join Table2 as t2 on t1.Year = t2.Year group by t1.Year, t1.Month, t1.State) update t1 set Weight = tv.Weight, StateWeight = tv.StateWeight, Overweight = tv.Overweight from Table1 as t1 inner join cte as tv on t1.Year = tv.Year and t1.Month = tv.Month and t1.State = tv.State;