2016-08-02 12 views
-1

私はテーブルとそのレコードを持っている:私はZを計算したいのですが、私は2つの以上の変数(BHgt2、SHgt2作成する必要があり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 

:作成することができます)計算のバックエンドにおける

 
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の組み合わせを使用しようとしました。しかし私の心は固まっているようだ。

1つのSELECT文が

誰でもselect文のためのアイデアを持っているZを計算するクエリを選択し、その後、BHgt2とSHgt2

ため、おそらく最初の更新クエリことはできないだろうか?これはSQL Server 2008用です

答えて

1

2つの項目を: 1)事実上のレベル= 0以外にスポットされたゴードンの応答。レベル= 1である必要があります。私が間違っていると私に知らせてください、私は再訪問するでしょう。あなたが望む結果の最後の行が正しいと確信していません。この。

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

すべての列が細かいようだが、私はBhgt2 –

+0

を入力したものよりも思えますDavidChen私の結果は、最後の行の10を除いて、あなたの望む結果と一致します。 –

+0

のための右の#が届かない@私はこれを試してみましょう、とところで、あなたの出力は、右の私が –

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;