2016-08-02 28 views
-1

我有一個表,它的記錄:SQL:累計列和點心在該行

 
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 

我要計算的Z,但我需要再創建兩個變量(BHgt2,SHgt2:可以創建在計算的後端)

 
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 

本質BHgt2是由類和級累計& SHgt2是其值+先前值的累計然而,級1 = 0和最後Z = CHGT + BHgt2 + SHgt2

我嘗試過使用ROW_Number &連接和cte組合;但我的想法似乎被卡住了。

如果一個單一的SELECT語句是不可能的,也許是BHgt2和SHgt2

第一更新查詢,然後選擇查詢計算在Z

任何人有一個select語句的想法?這是用於SQL Server 2008的

回答

1

兩個項目: 1)戈登的反應是幾乎當場就除了級別= 0。 2)我不相信你期望的結果的最後一行是正確的,我認爲你已經過了10。如果我不正確,讓我知道,我會重新訪問這個。

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; 

返回

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

讓我試試這個,和你的BTW輸出似乎是正確的比我打字 –

+0

每列似乎罰款,但我沒有得到正確的#進行Bhgt2 –

+0

@ DavidChen除了最後一行的10個結果外,我的結果與您想要的結果相符。 –

0

在更新版本的SQL Server中,這會更容易。但是你可以使用apply做到這一點:

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;