Consulta para acumular valor de fila a fila
Started by
Nikolas
, Apr 20 2012 07:55 PM
9 replies to this topic
#1
Posted 20 April 2012 - 07:55 PM
Hola Gente
Quiero mejor una consulta que ya tengo resulta de forma "artesanal".
Es un resumen de cuenta
Ejemplo:
FECHA - DEBE - HABER - SALDO DE LA FILA
01/05/2012 - $1000 - $700 - $ 300
10/05/2012 - $0500 - $000 - $ 800
20/05/2012 - $0000 - $200 - $ 600
Básicamente, lo que necesito es almacenar por fila, la resta de Debe y Haber, y tomarla como saldo para la próxima fila.
pd: estuve leyendo, y algunos lo resuelven con "cursores", los cuales no se utilizar.
http://www.firebirds...ql-declare.html ahi tengo como se declara.
Gracias.
Quiero mejor una consulta que ya tengo resulta de forma "artesanal".
Es un resumen de cuenta
Ejemplo:
FECHA - DEBE - HABER - SALDO DE LA FILA
01/05/2012 - $1000 - $700 - $ 300
10/05/2012 - $0500 - $000 - $ 800
20/05/2012 - $0000 - $200 - $ 600
Básicamente, lo que necesito es almacenar por fila, la resta de Debe y Haber, y tomarla como saldo para la próxima fila.
pd: estuve leyendo, y algunos lo resuelven con "cursores", los cuales no se utilizar.
http://www.firebirds...ql-declare.html ahi tengo como se declara.
Gracias.
#2
Posted 20 April 2012 - 08:27 PM
Hola
No entiendo amigo, en el ejemplo se restan debe y haber pero el saldo no esta en la siguiente fila.
No entiendo.
Saludos
No entiendo amigo, en el ejemplo se restan debe y haber pero el saldo no esta en la siguiente fila.
No entiendo.
Saludos
#3
Posted 20 April 2012 - 08:46 PM
Hola
No entiendo amigo, en el ejemplo se restan debe y haber pero el saldo no esta en la siguiente fila.
No entiendo.
Saludos
claro, lo tomo de la fila anterior.
01/05/2012 - $1000 - $700 - $ 300
10/05/2012 - $0500 - $000 - $ 800 (acá son 300 + 500)
20/05/2012 - $0000 - $200 - $ 600 (acá 800 - 200)
¿Me explico ahora?
#4
Posted 20 April 2012 - 09:57 PM
La información del enlace se refiere a si es un procedimiento de almacenado, ya si se trata de un query mira si te funciona una subconsulta para la operación.
Saludos!
Saludos!
#5
Posted 20 April 2012 - 11:14 PM
Haber si esto ayuda, trate de simular lo que tratas pero con una tabla que no va al caso pero sustituyo los campos que creo se involucran en tu caso Nikolas:
Creo con un For Select bastaría para realizar lo que deseas, me disculpo si no sustituí correctamente mis campos
Más información: http://www.firebirds...-forselect.html
Esta característica amo de Firebird que extraño en MS SQL Server
Saludos
CREATE OR ALTER PROCEDURE sp_CalculaSaldos
returns (
o_fecha date, <--Campo que nuestro Select extrae de tus tablas
o_debe numeric(18,2), <--Campo que nuestro Select extrae de tus tablas
o_haber numeric(18,2), <--Campo que nuestro Select extrae de tus tablas
o_saldo numeric(18,2)) <--Aquí va nuestro cálculo (debe - haber)
as
declare variable saldo_acumulado numeric(18,2);
begin
saldo_acumulado = 0;
For select fecha, debe, haber from cuotas where num_prestamo = '001-3241'
into :o_fecha, :o_debe, :o_haber
do
begin
o_saldo = saldo_acumulado + :o_debe - :o_haber;
saldo_acumulado = :o_saldo ;
suspend;
end
suspend;
end
Creo con un For Select bastaría para realizar lo que deseas, me disculpo si no sustituí correctamente mis campos
Más información: http://www.firebirds...-forselect.html
Esta característica amo de Firebird que extraño en MS SQL Server
Saludos
#6
Posted 23 April 2012 - 06:19 AM
Aqui lo hacemos como te comenta fredycc, un procedimiento almacenado que itera en un for y te acumula el saldo línea a línea, solo que con dos pequeñas "mejoras":
-Usamos un "execute sentence" dentro de nuestra SQL con lo que te ahorras crear explicitamente el procedure (aunque el resultado es el mismo).
-La clausula where se la pasamos como un parámetro al procedure, así como el saldo inicial por si no es 0 (un balance que incie a mitad de año tiene un saldo inical no nulo).
Pero la idea es esencialmente la misma.
-Usamos un "execute sentence" dentro de nuestra SQL con lo que te ahorras crear explicitamente el procedure (aunque el resultado es el mismo).
-La clausula where se la pasamos como un parámetro al procedure, así como el saldo inicial por si no es 0 (un balance que incie a mitad de año tiene un saldo inical no nulo).
Pero la idea es esencialmente la misma.
#7
Posted 23 April 2012 - 08:34 AM
a lo que responde Sergio, muy interesante , este link podría sugerirte muchas ideas con execute sentence, ademas de mejoras en su ejecución si usas FB 2.5
En el apartado: Improved performance
http://www.firebirds...l-execstat.html
Saludos
En el apartado: Improved performance
http://www.firebirds...l-execstat.html
Saludos
#8
Posted 30 April 2012 - 12:53 PM
gracias a todos por la ayuda.
Hoy retomo este tema pero aparentemente, con eso, lo resolvería.!
Hoy retomo este tema pero aparentemente, con eso, lo resolvería.!
#9
Posted 15 May 2012 - 07:35 AM
Regreso con este tema dado que me surgió un problema colateral.
Este SP
Me da, este resultado:
El problema es que me duplica la ultima fila.
Por otro lado, la consulta sola, me da las filas correctas. (Sin duplicar.) lo que me sugiere me el problema este en el SP.
gracias!
Este SP
begin
SALIDA =0; SALIDA2 =0;
FOR SELECT
Consulta
DO
BEGIN
if (:pendp is null) then
pendp = 0;
if (:pendd is null) then
pendd = 0;
SALIDA2 = SALIDA2 + :dolares;
SALIDA = SALIDA + :pesos;
suspend;
END
suspend;
end
Me da, este resultado:
El problema es que me duplica la ultima fila.
Por otro lado, la consulta sola, me da las filas correctas. (Sin duplicar.) lo que me sugiere me el problema este en el SP.
gracias!
#10
Posted 15 May 2012 - 08:24 AM
Resuelto
El segundo "suspend" es el que generaba ese fila.
begin
SALIDA =0; SALIDA2 =0;
FOR SELECT
Consulta
DO
BEGIN
if (:pendp is null) then
pendp = 0;
if (:pendd is null) then
pendd = 0;
SALIDA2 = SALIDA2 + :dolares;
SALIDA = SALIDA + :pesos;
suspend;
END
-- suspend; ESTE NO VA!
end