Zwei Punkte:1) Gordons Antwort war praktisch genau richtig, mit Ausnahme von Level=0. Sollte Level=1 sein
2) Ich bin nicht überzeugt, dass die letzte Zeile Ihrer gewünschten Ergebnisse richtig ist, ich denke, Sie liegen um 10 daneben. Wenn ich nicht richtig liege, lassen Sie es mich wissen und ich werde dies erneut überprüfen.
Declare @Table table (Profile varchar(25),Level int,CHgt int,BHgt int, SHgt int, Z int)
Insert into @Table values
('ABCD1' , 1 , 15 , 11 , 50 , 0),
('ABCD1' , 2 , 15 , 11 , 70 , 0),
('ABCD1' , 3 , 15 , 11 , 70 , 0),
('ABCD2' , 1 , 15 , 11 , 60 , 0),
('ABCD2' , 2 , 15 , 11 , 80 , 0),
('ABCD2' , 3 , 15 , 11 , 80 , 0),
('ABCD3' , 1 , 15 , 11 , 40 , 0),
('ABCD3' , 2 , 15 , 11 , 60 , 0),
('ABCD3' , 3 , 15 , 11 , 60 , 0)
select A.Profile
,A.Level
,A.CHgt
,A.BHgt
,A.SHgt
,B.Bhgt2
,Shgt2 = case when Level = 1 then 0 else SHgt2 end
,Z = CHgt + B.Bhgt2 + case when level = 1 then 0 else SHgt2 end
From @Table A
Cross Apply (Select Bhgt2 = sum(Bhgt)
,SHgt2 = sum(SHgt)
From @Table B
Where B.Profile = A.Profile and A.Level >= B.Level
) B;
Rückgabe
Profile Level CHgt BHgt SHgt Bhgt2 Shgt2 Z
ABCD1 1 15 11 50 11 0 26
ABCD1 2 15 11 70 22 120 157
ABCD1 3 15 11 70 33 190 238
ABCD2 1 15 11 60 11 0 26
ABCD2 2 15 11 80 22 140 177
ABCD2 3 15 11 80 33 220 268
ABCD3 1 15 11 40 11 0 26
ABCD3 2 15 11 60 22 100 137
ABCD3 3 15 11 60 33 160 208