2015-11-23 4 views
5

avevo questa tabellaaggiornamento della tabella con la colonna precedente con le eventuali cicli

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 

output atteso (con i loop) verrà

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 può essere il prodotto di (pv nel precedente riga) (ag) (PG) si prega di guardare in questo 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

Puoi salire a SQL Server 2012 (o superiore ...)? – Amit

+0

preferiscono SQL Server 2008 Amit – asktosmart

+0

provo questo 'aggiornamento b set b.projected_val = (a.projected_val * * b.ag b.pg) da test123 un sinistra join esterno test123 b sul b.pds = a. pds e b.rn = a.rn + 1; ' – asktosmart

risposta

3

Se solo significa without a while loop, può essere fatto con una CTE ricorsiva come questo:

Query:

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 viene utilizzato per ordinare si pds da RN. Il ciclo è il codice ricorsivo. Fa l'AG * pg con tutto il prodotto precedente.

I suoi dati:

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); 

uscita:

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

grazie Julen ..... :) – asktosmart

Problemi correlati