Deux éléments :1) La réponse de Gordon était pratiquement parfaite, à l'exception du niveau = 0. Doit être Niveau=1
2) Je ne suis pas convaincu que la dernière ligne de vos résultats souhaités est correcte, je pense que vous êtes en retard de 10. Si je ne suis pas correct, faites-le moi savoir et je le reverrai.
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;
Retours
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