¿ Como hacer este update...?

27/04/2004 - 16:58 por Eusebio | Informe spam
hola grupo,



Solucioné el problema que expongo a continuación, pero usando un cursor, lo
cual he visto con mucha frecuencia en este foro que no es la manera más
recomendable por rendimiento. Lo que estoy buscando es una manera de hacerlo
que mejore la velocidad de ejecución. Inicialmente pensé que era muy
sencillo con un UPDATE pero me he vuelto un ocho y no he podido, por eso
recurro a ustedes.

Definicion de la Tabla:


create table #Test ( IdReg int , Sa int Null , Incremento int , Sf int
Null )

insert into #test values ( 1 , 10 , 1 , null )
insert into #test values ( 2 , null, 5 , null )
insert into #test values ( 3 , null, 2 , null )
insert into #test values ( 4 , null, 1 , null )

Donde:

IdReg : Llave primaria, establece el orden de los registros.

Sa: Valor Acumulado anterior o saldo anterior. Para el primer registro es un
valor conocido, para los siguientes registros es igual al valor del Sf del
registro anterior. Por ejemplo, para el registro número 2 el valor de Sa es
igual al valor de Sf del registro nímero 1.

Incremento : un valor de incremento que ya esta en la tabla

Sf: valor acumulado final, saldo final --> Sf = Sa + Incremento

Contenido de la tabla original

Sa Incremento Sf
10 1 ?
? 5 ?
? 2 ?
? 1 ?

lo que debe hacer el update es calcular el saldo final (Sf) sumando Sa +
Incremento, teneiendo en cuenta que Sa es igual a Sf del registro anterior


Sa Incremento Sf

10 1 11
11 5 16
16 2 18
18 1 19





mil gracias


Eusebio
 

Leer las respuestas

#1 ulises
27/04/2004 - 17:35 | Informe spam
Podría servirte algo como :

declare @ini int
select @ini = sa from #test where idreg = 1
update #test set @ini = sf = @ini + incremento
update #test set sa = sf - incremento
select * from #test

idreg sa incremento sf
1 10 1 11
2 11 5 16
3 16 2 18
4 18 1 19

(4 row(s) affected)

el inconveniente que tiene es que tendrías que modificar
el idreg para que sea clustered y te pueda garantizar un
orden en la actualización.

create table #Test ( idreg int primary key clustered, ...

Saludos,
Ulises

hola grupo,



Solucioné el problema que expongo a continuación, pero


usando un cursor, lo
cual he visto con mucha frecuencia en este foro que no es


la manera más
recomendable por rendimiento. Lo que estoy buscando es


una manera de hacerlo
que mejore la velocidad de ejecución. Inicialmente pensé


que era muy
sencillo con un UPDATE pero me he vuelto un ocho y no he


podido, por eso
recurro a ustedes.

Definicion de la Tabla:


create table #Test ( IdReg int , Sa int Null ,


Incremento int , Sf int
Null )

insert into #test values ( 1 , 10 , 1 , null )
insert into #test values ( 2 , null, 5 , null )
insert into #test values ( 3 , null, 2 , null )
insert into #test values ( 4 , null, 1 , null )

Donde:

IdReg : Llave primaria, establece el orden de los


registros.

Sa: Valor Acumulado anterior o saldo anterior. Para el


primer registro es un
valor conocido, para los siguientes registros es igual al


valor del Sf del
registro anterior. Por ejemplo, para el registro número 2


el valor de Sa es
igual al valor de Sf del registro nímero 1.

Incremento : un valor de incremento que ya esta en la


tabla

Sf: valor acumulado final, saldo final --> Sf = Sa +


Incremento

Contenido de la tabla original

Sa Incremento Sf
10 1 ?
? 5 ?
? 2 ?
? 1 ?

lo que debe hacer el update es calcular el saldo final


(Sf) sumando Sa +
Incremento, teneiendo en cuenta que Sa es igual a Sf del


registro anterior


Sa Incremento Sf

10 1 11
11 5 16
16 2 18
18 1 19





mil gracias


Eusebio


.

Preguntas similares