manejo de fetch

27/02/2006 - 22:04 por Miguel Arias | Informe spam
Buenas tardes a tod@s:

la cuestion es la siguiente:
tengo una tlb movimientos y otra saldos
en la tabla movimientos tengo la siguiente inf.
cuenta monto
1 1
1 1
2 1
2 2
3 3
3 3

en la tabla saldos después de ejecutar el siguiente código tiene que quedar
así:
cuenta monto
1 2 --el valor total de los montos de las cuentas 1
2 3 --el valor total de los montos de las cuentas 2
3 6 --el valor total de los montos de las cuentas 3
etc...

pero cuando ejecuto el código anexo queda así:
cuenta monto
1 7
2 6
3 6

este es el código que ejecuto, les agradezco que me puedan ayudar a
encontrar el error.
de antemano muchas gracias.


DECLARE @CUENTA INT
DECLARE @MONTO INT

DECLARE TEST_CURSOR CURSOR FOR
SELECT CUENTA, MONTO FROM MOVIMIENTOS



OPEN TEST_CURSOR
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
WHILE @@fetch_status = 0



BEGIN
IF EXISTS(SELECT CUENTA FROM SALDOS WHERE CUENTA = @CUENTA)
UPDATE SALDOS
SET MONTO = MONTO + @MONTO
ELSE
INSERT INTO SALDOS VALUES (@CUENTA,@MONTO)
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
END
CLOSE TEST_CURSOR
DEALLOCATE TEST_CURSOR



MIGUEL F. ARIAS PERDOMO

mfariasp@alfcom.com

Preguntas similare

Leer las respuestas

#1 Isaias
27/02/2006 - 22:36 | Informe spam
Miguel

Si lo que quieres es hacer una sumatoria, porque no hacerlo de forma directa.

SELECT Cuenta, SUM(Monto) FROM Tutabla GROUP BY cuenta


Saludos
IIslas


"Miguel Arias" escribió:

Buenas tardes a :

la cuestion es la siguiente:
tengo una tlb movimientos y otra saldos
en la tabla movimientos tengo la siguiente inf.
cuenta monto
1 1
1 1
2 1
2 2
3 3
3 3

en la tabla saldos después de ejecutar el siguiente código tiene que quedar
así:
cuenta monto
1 2 --el valor total de los montos de las cuentas 1
2 3 --el valor total de los montos de las cuentas 2
3 6 --el valor total de los montos de las cuentas 3
etc...

pero cuando ejecuto el código anexo queda así:
cuenta monto
1 7
2 6
3 6

este es el código que ejecuto, les agradezco que me puedan ayudar a
encontrar el error.
de antemano muchas gracias.


DECLARE @CUENTA INT
DECLARE @MONTO INT

DECLARE TEST_CURSOR CURSOR FOR
SELECT CUENTA, MONTO FROM MOVIMIENTOS



OPEN TEST_CURSOR
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
WHILE @@fetch_status = 0



BEGIN
IF EXISTS(SELECT CUENTA FROM SALDOS WHERE CUENTA = @CUENTA)
UPDATE SALDOS
SET MONTO = MONTO + @MONTO
ELSE
INSERT INTO SALDOS VALUES (@CUENTA,@MONTO)
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
END
CLOSE TEST_CURSOR
DEALLOCATE TEST_CURSOR



MIGUEL F. ARIAS PERDOMO








Respuesta Responder a este mensaje
#2 Miguel Arias
27/02/2006 - 23:32 | Informe spam
Isaías, gracias por la respuesta; pero me surge otra pregunta:
con este código yo validaba que la cuenta existiera o no
IF EXISTS(SELECT CUENTA FROM SALDOS WHERE CUENTA = @CUENTA)
UPDATE SALDOS
SET MONTO = MONTO + @MONTO
ELSE
INSERT INTO SALDOS VALUES (@CUENTA,@MONTO)
con la sumatoria como valido esto??
"Isaias" escribió en el mensaje
news:
Miguel

Si lo que quieres es hacer una sumatoria, porque no hacerlo de forma
directa.

SELECT Cuenta, SUM(Monto) FROM Tutabla GROUP BY cuenta


Saludos
IIslas


"Miguel Arias" escribió:

Buenas tardes a :

la cuestion es la siguiente:
tengo una tlb movimientos y otra saldos
en la tabla movimientos tengo la siguiente inf.
cuenta monto
1 1
1 1
2 1
2 2
3 3
3 3

en la tabla saldos después de ejecutar el siguiente código tiene que
quedar
así:
cuenta monto
1 2 --el valor total de los montos de las cuentas 1
2 3 --el valor total de los montos de las cuentas 2
3 6 --el valor total de los montos de las cuentas 3
etc...

pero cuando ejecuto el código anexo queda así:
cuenta monto
1 7
2 6
3 6

este es el código que ejecuto, les agradezco que me puedan ayudar a
encontrar el error.
de antemano muchas gracias.


DECLARE @CUENTA INT
DECLARE @MONTO INT

DECLARE TEST_CURSOR CURSOR FOR
SELECT CUENTA, MONTO FROM MOVIMIENTOS



OPEN TEST_CURSOR
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
WHILE @@fetch_status = 0



BEGIN
IF EXISTS(SELECT CUENTA FROM SALDOS WHERE CUENTA = @CUENTA)
UPDATE SALDOS
SET MONTO = MONTO + @MONTO
ELSE
INSERT INTO SALDOS VALUES (@CUENTA,@MONTO)
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
END
CLOSE TEST_CURSOR
DEALLOCATE TEST_CURSOR



MIGUEL F. ARIAS PERDOMO








Respuesta Responder a este mensaje
#3 Maxi [MVP]
28/02/2006 - 01:03 | Informe spam
Miguel, debes usar la consulta directamente UPDATE, de donde sale Monto?




Salu2
-
[MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org

MSN:

"Miguel Arias" escribió en el mensaje
news:%23ue4vy%
Isaías, gracias por la respuesta; pero me surge otra pregunta:
con este código yo validaba que la cuenta existiera o no
IF EXISTS(SELECT CUENTA FROM SALDOS WHERE CUENTA = @CUENTA)
UPDATE SALDOS
SET MONTO = MONTO + @MONTO
ELSE
INSERT INTO SALDOS VALUES (@CUENTA,@MONTO)
con la sumatoria como valido esto??
"Isaias" escribió en el mensaje
news:
Miguel

Si lo que quieres es hacer una sumatoria, porque no hacerlo de forma
directa.

SELECT Cuenta, SUM(Monto) FROM Tutabla GROUP BY cuenta


Saludos
IIslas


"Miguel Arias" escribió:

Buenas tardes a :

la cuestion es la siguiente:
tengo una tlb movimientos y otra saldos
en la tabla movimientos tengo la siguiente inf.
cuenta monto
1 1
1 1
2 1
2 2
3 3
3 3

en la tabla saldos después de ejecutar el siguiente código tiene que
quedar
así:
cuenta monto
1 2 --el valor total de los montos de las cuentas 1
2 3 --el valor total de los montos de las cuentas 2
3 6 --el valor total de los montos de las cuentas 3
etc...

pero cuando ejecuto el código anexo queda así:
cuenta monto
1 7
2 6
3 6

este es el código que ejecuto, les agradezco que me puedan ayudar a
encontrar el error.
de antemano muchas gracias.


DECLARE @CUENTA INT
DECLARE @MONTO INT

DECLARE TEST_CURSOR CURSOR FOR
SELECT CUENTA, MONTO FROM MOVIMIENTOS



OPEN TEST_CURSOR
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
WHILE @@fetch_status = 0



BEGIN
IF EXISTS(SELECT CUENTA FROM SALDOS WHERE CUENTA = @CUENTA)
UPDATE SALDOS
SET MONTO = MONTO + @MONTO
ELSE
INSERT INTO SALDOS VALUES (@CUENTA,@MONTO)
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
END
CLOSE TEST_CURSOR
DEALLOCATE TEST_CURSOR



MIGUEL F. ARIAS PERDOMO














Respuesta Responder a este mensaje
#4 ulises
28/02/2006 - 01:12 | Informe spam
Te sale ese resultado porque no està¡s colocando la claàºsula WHERE en el
UPDATE.

Pero me parece que es mà¡s directo usar una sentencia de agrupación

DELETE FROM saldos
INSERT INTO saldos
SELECT cuenta, SUM(monto) FROM movimientos GROUP BY cuenta

ahora bien, si lo que tienes una tabla de saldos que contiene información
previa que debe ser actualizada por la tabla de movimientos, podrà­as usar
dos sentencias una para actualizar y otra para insertar, algo como (sin
probar):

INSERT INTO
SELECT cuenta, SUM(monto) FROM movimientos
WHERE cuenta NOT IN ( SELECT cuenta FROM saldos )
GROUP BY cuenta
GO
UPDATE saldos
SET monto = monto + m.monto
FROM saldos s JOIN (
SELECT cuenta, SUM(monto) as monto FROM movimientos
WHERE cuenta IN ( SELECT cuenta FROM saldos ) ) m ON s.cuenta = m.cuenta
GO

Saludos,
Ulises

Miguel Arias wrote:

Buenas tardes a :

la cuestion es la siguiente:
tengo una tlb movimientos y otra saldos
en la tabla movimientos tengo la siguiente inf.
cuenta monto
1 1
1 1
2 1
2 2
3 3
3 3

en la tabla saldos después de ejecutar el siguiente código tiene que
quedar así:
cuenta monto
1 2 --el valor total de los montos de las cuentas 1
2 3 --el valor total de los montos de las cuentas 2
3 6 --el valor total de los montos de las cuentas 3
etc...

pero cuando ejecuto el código anexo queda así:
cuenta monto
1 7
2 6
3 6

este es el código que ejecuto, les agradezco que me puedan ayudar a
encontrar el error.
de antemano muchas gracias.


DECLARE @CUENTA INT
DECLARE @MONTO INT

DECLARE TEST_CURSOR CURSOR FOR
SELECT CUENTA, MONTO FROM MOVIMIENTOS



OPEN TEST_CURSOR
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
WHILE @@fetch_status = 0



BEGIN
IF EXISTS(SELECT CUENTA FROM SALDOS WHERE CUENTA = @CUENTA)
UPDATE SALDOS
SET MONTO = MONTO + @MONTO
ELSE
INSERT INTO SALDOS VALUES (@CUENTA,@MONTO)
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
END
CLOSE TEST_CURSOR
DEALLOCATE TEST_CURSOR



MIGUEL F. ARIAS PERDOMO


Respuesta Responder a este mensaje
#5 Miguel Arias
28/02/2006 - 01:21 | Informe spam
Maxi la verdad no te entiendo muy bien la pregunta te agradeceria si fueras
mas claro.

Muchas gracias
"Maxi [MVP]" escribió en el mensaje
news:%23paC5p$
Miguel, debes usar la consulta directamente UPDATE, de donde sale Monto?




Salu2
-
[MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org

MSN:

"Miguel Arias" escribió en el mensaje
news:%23ue4vy%
Isaías, gracias por la respuesta; pero me surge otra pregunta:
con este código yo validaba que la cuenta existiera o no
IF EXISTS(SELECT CUENTA FROM SALDOS WHERE CUENTA = @CUENTA)
UPDATE SALDOS
SET MONTO = MONTO + @MONTO
ELSE
INSERT INTO SALDOS VALUES (@CUENTA,@MONTO)
con la sumatoria como valido esto??
"Isaias" escribió en el mensaje
news:
Miguel

Si lo que quieres es hacer una sumatoria, porque no hacerlo de forma
directa.

SELECT Cuenta, SUM(Monto) FROM Tutabla GROUP BY cuenta


Saludos
IIslas


"Miguel Arias" escribió:

Buenas tardes a :

la cuestion es la siguiente:
tengo una tlb movimientos y otra saldos
en la tabla movimientos tengo la siguiente inf.
cuenta monto
1 1
1 1
2 1
2 2
3 3
3 3

en la tabla saldos después de ejecutar el siguiente código tiene que
quedar
así:
cuenta monto
1 2 --el valor total de los montos de las cuentas 1
2 3 --el valor total de los montos de las cuentas 2
3 6 --el valor total de los montos de las cuentas 3
etc...

pero cuando ejecuto el código anexo queda así:
cuenta monto
1 7
2 6
3 6

este es el código que ejecuto, les agradezco que me puedan ayudar a
encontrar el error.
de antemano muchas gracias.


DECLARE @CUENTA INT
DECLARE @MONTO INT

DECLARE TEST_CURSOR CURSOR FOR
SELECT CUENTA, MONTO FROM MOVIMIENTOS



OPEN TEST_CURSOR
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
WHILE @@fetch_status = 0



BEGIN
IF EXISTS(SELECT CUENTA FROM SALDOS WHERE CUENTA = @CUENTA)
UPDATE SALDOS
SET MONTO = MONTO + @MONTO
ELSE
INSERT INTO SALDOS VALUES (@CUENTA,@MONTO)
FETCH NEXT FROM TEST_CURSOR
INTO @CUENTA, @MONTO
END
CLOSE TEST_CURSOR
DEALLOCATE TEST_CURSOR



MIGUEL F. ARIAS PERDOMO


















Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida