Como seleccionar registros unicos de varios registros duplicados pero obteniendo lso otros campos del registro.

12/10/2005 - 18:27 por Pedro Valle | Informe spam
Tengan cordiales saludos.

Necesito realizar lo siguiente pero sin utilizar cursores, se que se puede.
Si es necesario se puede utilizar tablas derivadas o temporales, UPDATE,
etc.

1. Se necesita actualizar los saldos de movimientos historicos de un
conjunto de registros, estos estan ordenados de mayor a menor segun la
fecha, se tiene el saldo actual en el primer registro y se debe actualizar
los registros anteriores.

PK Codigo TipoMov Fecha Ingreso Retiro
Saldo
1 0001 S 31/01/2005 0
10 10
2 0001 S 20/01/2005 0
20 0
3 0001 S 10/01/2005 0
20 0
4 0001 I 10/01/2005 60
0 0
5 0001 S 10/01/2005 0
20 0

El resultado debe ser así despues de actualizar los saldos.

PK Codigo TipoMov Fecha Ingreso Retiro
Saldo
1 0001 S 31/01/2005 0
10 10
2 0001 S 20/01/2005 0
20 20
3 0001 S 10/01/2005 0
20 40
4 0001 I 10/01/2005 60 0
60
5 0001 S 10/01/2005 0
20 0

Como se daran cuenta solo es cuestion de ir sumando al saldo los retiros y
restando los ingresos. No se quiere empezar de forma ordenada por la fecha
de menor a mayor, ya que eso significaria que se necesita saber el saldo
inicial pero la idea es a través del saldo final ir retrocediendo.

Esto debe ser hecho sin utilizar cursores y solo con UPDATE, debe tomarse en
cuenta que no solo estan estos registros, hay otros de otro Codigo.
Utilizando variables temporales con Update he consegido realizar la
actualización de los saldos pero cuando esta ordenado la fecha de menor a
mayor de la siguiente manera.

DECLARE @Saldo numeric(12)
DECLARE @IDt char(10)

SET @Saldo = 0
SET @IDt = ''

UPDATE Mov
SET
@Saldo = CASE WHEN IDt <> @IDt THEN Saldo ELSE Saldo + @Saldo END,
cpnSaldo = @Saldo,
@IDt = IDt
FROM #Movimiento Mov

Ahora deberia haber una manera de hacerlo al contrario.

2. Recuperar unicos registros de varios registros. Supongan se tiene los
siguientes registros.

PK Codigo CodSucursal
1 0001 0002
2 0001 0001
3 0001 0001
4 0002 0001
5 0002 0002
6 0003 0005

El resultado que se quiere obtener es el siguiente:

Codigo CodSucursal
0001 0002
0002 0001
0003 0005

Agradeciendoles por su ayuda.
Pedro Valle
 

Leer las respuestas

#1 Maxi
12/10/2005 - 19:07 | Informe spam
Hola, serias tan amable de poner esto en un .txt porque el mail lo deforma
:(


Salu2
Maxi [MVP SQL SERVER]


"Pedro Valle" escribió en el mensaje
news:
Tengan cordiales saludos.

Necesito realizar lo siguiente pero sin utilizar cursores, se que se
puede. Si es necesario se puede utilizar tablas derivadas o temporales,
UPDATE, etc.

1. Se necesita actualizar los saldos de movimientos historicos de un
conjunto de registros, estos estan ordenados de mayor a menor segun la
fecha, se tiene el saldo actual en el primer registro y se debe actualizar
los registros anteriores.

PK Codigo TipoMov Fecha Ingreso Retiro
Saldo
1 0001 S 31/01/2005 0 10
10
2 0001 S 20/01/2005 0 20
0
3 0001 S 10/01/2005 0 20
0
4 0001 I 10/01/2005 60 0
0
5 0001 S 10/01/2005 0 20
0

El resultado debe ser así despues de actualizar los saldos.

PK Codigo TipoMov Fecha Ingreso Retiro
Saldo
1 0001 S 31/01/2005 0 10
10
2 0001 S 20/01/2005 0 20
20
3 0001 S 10/01/2005 0 20
40
4 0001 I 10/01/2005 60
0 60
5 0001 S 10/01/2005 0 20
0

Como se daran cuenta solo es cuestion de ir sumando al saldo los retiros y
restando los ingresos. No se quiere empezar de forma ordenada por la fecha
de menor a mayor, ya que eso significaria que se necesita saber el saldo
inicial pero la idea es a través del saldo final ir retrocediendo.

Esto debe ser hecho sin utilizar cursores y solo con UPDATE, debe tomarse
en cuenta que no solo estan estos registros, hay otros de otro Codigo.
Utilizando variables temporales con Update he consegido realizar la
actualización de los saldos pero cuando esta ordenado la fecha de menor a
mayor de la siguiente manera.

DECLARE @Saldo numeric(12)
DECLARE @IDt char(10)

SET @Saldo = 0
SET @IDt = ''

UPDATE Mov
SET
@Saldo = CASE WHEN IDt <> @IDt THEN Saldo ELSE Saldo + @Saldo END,
cpnSaldo = @Saldo,
@IDt = IDt
FROM #Movimiento Mov

Ahora deberia haber una manera de hacerlo al contrario.

2. Recuperar unicos registros de varios registros. Supongan se tiene los
siguientes registros.

PK Codigo CodSucursal
1 0001 0002
2 0001 0001
3 0001 0001
4 0002 0001
5 0002 0002
6 0003 0005

El resultado que se quiere obtener es el siguiente:

Codigo CodSucursal
0001 0002
0002 0001
0003 0005

Agradeciendoles por su ayuda.
Pedro Valle

Preguntas similares