¿ 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

Preguntas similare

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


.

Respuesta Responder a este mensaje
#2 Eusebio
28/04/2004 - 00:57 | Informe spam
muchas gracias Ulises, nunca se me hubiera ocurrido.

Eusebio


"ulises" escribió en el mensaje
news:4d5601c42c6d$43a43970$
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


.

Respuesta Responder a este mensaje
#3 Javier Loria
02/05/2004 - 12:41 | Informe spam
Hola:
La alternativa es mucho mas compleja:
=UPDATE #Test
SET Sa=NewSa
, Sf=NewSf
FROM #Test
JOIN (SELECT T1.IdReg
, I.Sa+SUM(COALESCE(T2.Incremento,0)) AS NewSa
, I.Sa+T1.Incremento+SUM(COALESCE(T2.Incremento,0)) As
NewSf
FROM #Test AS T1
LEFT JOIN #Test AS T2
ON T1.IdReg>T2.IdReg
JOIN #Test I
ON I.IdReg=1
GROUP BY T1.IdReg, I.Sa, T1.Incremento
) AS New
ON #Test.IdReg=New.IdReg

= Horrible pero mas rapida y tecnicamente superior porque no depende del
orden de la tabla, y hace en un solo SET la actualizacion.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

ulises escribio:
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


.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida