2015-11-23 67 views
5

表我有這個表更新與前柱,用任何環路

test123     
rn pds  pv bl ag pg 
1 6817 90 15 1 1 
2 6817  12 1 1 
3 6817  10 1 2 
4 6817  10 1 3 
5 6817  11 1 2 
1 6818 92 15 1 1 
2 6818  12 1 1 
3 6818  10 1 2 
4 6818  11 1 3 
5 6818  9 1 2 
6 6818  8 2 1 

預期輸出(帶移出循環)將是

test123     
rn pds  pv bl ag pg 
1 6817 90 15 1 1 
2 6817 90 12 1 1 
3 6817 180 10 1 2 
4 6817 540 10 1 3 
5 6817 1080 11 1 2 
1 6818 92 15 1 1 
2 6818 92 12 1 1 
3 6818 184 10 1 2 
4 6818 552 11 1 3 
5 6818 1104 9 1 2 
6 6818 2208 8 2 1 

PV可以是(PV值的乘積上一行)(AG)(PG)在 請看這個link

update b set b.pv=(a.pv*b.ag*b.pg) 
from test123 a 
left outer join test123 b 
on b.pds=a.pds and b.rn=a.rn+1 and a.pds=b.pds; 
+0

話,可以上浮到SQL Server 2012(或更高版本)? – Amit

+0

喜歡的SQL Server 2008阿米特 – asktosmart

+0

我試試這個 '更新b 集b.projected_val =(a.projected_val * b.ag * b.pg) 從test123上b.pds一個 左外連接test123 B = A。 pds and b.rn = a.rn + 1;' – asktosmart

回答

3

如果你只意味着without a while loop,它可以用遞歸CTE這樣進行:

查詢:

with ord as(
    Select rn, pds, pv, bl, ag, pg, n = ROW_NUMBER() over(partition by pds order by rn) 
    From @data 
), loop as (
    select pds, n, pv, mx = ag*pg From ord Where n = 1 
    Union All 
    Select o.pds, o.n, l.pv, mx * ag*pg From loop l 
    Inner Join ord o on l.pds = o.pds and l.n+1 = o.n 
) 
Select o.rn, o.pds, pv = l.pv*l.mx, o.bl, o.ag, o.pg 
From loop l 
Inner Join ord o on o.pds = l.pds and o.n = l.n 
Order by o.pds, o.n; 

ORD用於訂購RN上PDS。 循環是遞歸cte。它使用以前的所有產品都具有ag * pg。

您的數據:

Declare @data table (rn int, pds int, pv int, bl int, ag int, pg int) 
Insert into @data(rn, pds, pv, bl, ag, pg) values 
    (1, 6817, 90, 15, 1, 1) 
    , (2, 6817, null, 12, 1, 1) 
    , (3, 6817, null, 10, 1, 2) 
    , (4, 6817, null, 10, 1, 3) 
    , (5, 6817, null, 11, 1, 2) 
    , (1, 6818, 92, 15, 1, 1) 
    , (2, 6818, null, 12, 1, 1) 
    , (3, 6818, null, 10, 1, 2) 
    , (4, 6818, null, 11, 1, 3) 
    , (5, 6818, null, 9, 1, 2) 
    , (6, 6818, null, 8, 2, 1); 

輸出:

rn pds  pv  bl ag pg 
1 6817 90  15 1 1 
2 6817 90  12 1 1 
3 6817 180  10 1 2 
4 6817 540  10 1 3 
5 6817 1080 11 1 2 
1 6818 92  15 1 1 
2 6818 92  12 1 1 
3 6818 184  10 1 2 
4 6818 552  11 1 3 
5 6818 1104 9 1 2 
6 6818 2208 8 2 1 
+0

謝謝Julen ..... :) – asktosmart