2016-08-02 11 views
-1

ich einen Tisch und seinen Rekord habe:SQL: Kumulierte Spalten & Summe über die Zeile

 
Profile | Level | CHgt | BHgt | SHgt | Z 
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 
ABCD1 | 1  | 15 | 11 | 50 | 0 
ABCD1 | 2  | 15 | 11 | 70 | 0 
ABCD1 | 3  | 15 | 11 | 70 | 0 

Ich mag die Z berechnen, aber ich brauche noch zwei weitere Variablen erstellen (BHgt2, SHgt2: erstellt werden kann in dem hinteren Ende des Berechnungs)

 
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 | 170 | 218 
ABCD1 | 1  | 15 | 11 | 50 | 11 | 0  | 26 
ABCD1 | 2  | 15 | 11 | 70 | 22 | 120 | 157 
ABCD1 | 3  | 15 | 11 | 70 | 33 | 190 | 238 

Wesentlichen BHgt2 ist akkumulativen von Profil und Pegel & SHgt2 ist akkumulativen seines Wertes + vorherigen Wert jedoch Stufe 1 = 0 und schließlich Z = CHgt + BHgt2 + SHgt2

Ich habe versucht, ROW_Number & verbindet und Kombination von mit CTE; aber mein Verstand scheint festgefahren zu sein.

Wenn eine einzige Select-Anweisung nicht möglich sein wird, vielleicht erste Update-Abfragen für BHgt2 und SHgt2

dann auf Abfrage Wählen Sie die Z

Wer berechnen für eine select-Anweisung eine Idee? Dies ist für SQL Server 2008

Antwort

1

Zwei Elemente: 1) Gordon Antwort wurde praktisch vor Ort auf mit Ausnahme der Stufe = 0. Sollte sein Level = 1

2) Ich bin nicht davon überzeugt, dass die letzte Reihe Ihrer gewünschten Ergebnisse korrekt ist, ich denke, Sie sind um 10. Wenn ich nicht richtig bin, lassen Sie es mich wissen und ich werde wieder besuchen Dies.

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; 

Returns

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 
+0

mir dies Lassen versuchen, und btw Recht Ausgang scheint als die, die ich –

+0

Alle Spalten in Ordnung scheint getippt, aber ich bin nicht das Recht # für Bhgt2 –

+0

bekommen @ DavidChen Meine Ergebnisse stimmen mit den gewünschten Ergebnissen überein, mit Ausnahme der 10 in der letzten Reihe. –

0

Dies wäre in neueren Versionen von SQL Server einfacher. Aber man kann diese apply mit tun:

select t.*, t2.Bhgt2, 
     (case when level = 0 then 0 else SHgt2 end) as Shgt2, 
     (CHgt + t2.Bhgt2 + (case when level = 0 then 0 else SHgt2 end)) as Z 
from t cross apply 
    (select sum(Bhgt) as Bhgt2, 
      sum(SHgt) as SHgt2 
     from t t2 
     where t2.profile = t.profile and t2.level <= t.level 
    ) t2;