Página 1 de 1

Columna de saldo acumulado

Publicado: Vie Sep 29, 2006 7:18 am
por Carlos Mora
La verdad es que no sé como encarar el tema.
Dada una tabla como la siguiente, clásica de toda contabilidad:
Cuenta/Fecha/Debe/Haber
Necesito crear una consulta que me retorne, para una cuenta dada:
Fecha/Debe/Haber/*SALDO*
Como sorchos hago para calcular el saldo dentro de la misma consulta? Se
puede?
Carlos

Columna de saldo acumulado

Publicado: Vie Sep 29, 2006 1:55 pm
por jose.luis
Carlos,
Suponiendo que la tabla es
Cuenta Fecha Debe Haber
4301 01012006 100 200
4302 01012006 25 15
Y quieres como resultado
Cuenta Fecha Saldo
4301 01012006 300
4302 01012006 35
Prueba esto:
SELECT cuenta, fecha, (debe+haber) as saldo FROM Cuentas
Saludos,
José Luis Capel
"Carlos Mora" <carlosmora@iespana.es> escribió en el mensaje
news:[email=451cacb3@news.xailer.com...]451cacb3@news.xailer.com...[/email]
> La verdad es que no sé como encarar el tema.
>
> Dada una tabla como la siguiente, clásica de toda contabilidad:
>
> Cuenta/Fecha/Debe/Haber
>
> Necesito crear una consulta que me retorne, para una cuenta dada:
>
> Fecha/Debe/Haber/*SALDO*
>
> Como sorchos hago para calcular el saldo dentro de la misma consulta? Se
> puede?
>
> Carlos

Columna de saldo acumulado

Publicado: Vie Sep 29, 2006 7:22 pm
por Carlos Mora
José Luis,
> Cuenta Fecha Debe Haber
> 4301 01012006 100 200
> 4302 01012006 25 15
>
> Y quieres como resultado
> Cuenta Fecha Saldo
> 4301 01012006 300
> 4302 01012006 35
>
> Prueba esto:
>
> SELECT cuenta, fecha, (debe+haber) as saldo FROM Cuentas
No mi estimadí­simo! Esa la sé!!
La cosa es que dados
Cuenta Fecha Debe Haber
4301 01/01/2006 100.00 0.00
4301 01/02/2006 120.00 0.00
4301 03/05/2006 10.00 0.00
4301 06/05/2006 0.00 30.00
4301 24/05/2006 0.00 120.00
4301 01/06/2006 100.00 0.00
4301 01/07/2006 100.00 0.00
4302 01/01/2006 100.00 0.00
4302 01/02/2006 120.00 0.00
4302 03/05/2006 10.00 0.00
4302 06/05/2006 0.00 30.00
4302 24/05/2006 0.00 120.00
4302 01/06/2006 100.00 0.00
4302 01/07/2006 100.00 0.00
efectuar una consulta que obtenga el extracto de la cuenta con una
columna de saldo acumulado
Cuenta Fecha Debe Haber Saldo
4301 01/01/2006 100.00 0.00 100.00
4301 01/02/2006 120.00 0.00 220.00
4301 03/05/2006 10.00 0.00 230.00
4301 06/05/2006 0.00 30.00 200.00
4301 24/05/2006 0.00 120.00 80.00
4301 01/06/2006 100.00 0.00 180.00
4301 01/07/2006 100.00 0.00 280.00
4302 01/01/2006 100.00 0.00 100.00
4302 01/02/2006 120.00 0.00 220.00
4302 03/05/2006 10.00 0.00 230.00
4302 06/05/2006 0.00 30.00 200.00
4302 24/05/2006 0.00 120.00 80.00
4302 01/06/2006 100.00 0.00 180.00
4302 01/07/2006 100.00 0.00 280.00
El tema es la columna SALDO donde se acumula. Y al cambiar de cuenta el
saldo se vuelve 0 además, como cuando cambia de 4301 a 4302
No me doy cuenta como lo podrí­a hacer en la misma consulta, obviamente a
mano lo teje cualquiera ;)
Un saludo

Columna de saldo acumulado

Publicado: Vie Sep 29, 2006 8:13 pm
por Manu
Aveces es mejor crear una tabla auxiliar y luego por ejemplo una vista
de la tabla auxiliar y la tabla original.
Realmente por el tiempo de proceso no tiene que ser muy grande...
Carlos Mora escribió:
> José Luis,
>> Cuenta Fecha Debe Haber
>> 4301 01012006 100 200
>> 4302 01012006 25 15
>>
>> Y quieres como resultado
>> Cuenta Fecha Saldo
>> 4301 01012006 300
>> 4302 01012006 35
>>
>> Prueba esto:
>>
>> SELECT cuenta, fecha, (debe+haber) as saldo FROM Cuentas
> No mi estimadí­simo! Esa la sé!!
>
>
> La cosa es que dados
>
> Cuenta Fecha Debe Haber
> 4301 01/01/2006 100.00 0.00
> 4301 01/02/2006 120.00 0.00
> 4301 03/05/2006 10.00 0.00
> 4301 06/05/2006 0.00 30.00
> 4301 24/05/2006 0.00 120.00
> 4301 01/06/2006 100.00 0.00
> 4301 01/07/2006 100.00 0.00
> 4302 01/01/2006 100.00 0.00
> 4302 01/02/2006 120.00 0.00
> 4302 03/05/2006 10.00 0.00
> 4302 06/05/2006 0.00 30.00
> 4302 24/05/2006 0.00 120.00
> 4302 01/06/2006 100.00 0.00
> 4302 01/07/2006 100.00 0.00
>
> efectuar una consulta que obtenga el extracto de la cuenta con una
> columna de saldo acumulado
>
>
> Cuenta Fecha Debe Haber Saldo
> 4301 01/01/2006 100.00 0.00 100.00
> 4301 01/02/2006 120.00 0.00 220.00
> 4301 03/05/2006 10.00 0.00 230.00
> 4301 06/05/2006 0.00 30.00 200.00
> 4301 24/05/2006 0.00 120.00 80.00
> 4301 01/06/2006 100.00 0.00 180.00
> 4301 01/07/2006 100.00 0.00 280.00
> 4302 01/01/2006 100.00 0.00 100.00
> 4302 01/02/2006 120.00 0.00 220.00
> 4302 03/05/2006 10.00 0.00 230.00
> 4302 06/05/2006 0.00 30.00 200.00
> 4302 24/05/2006 0.00 120.00 80.00
> 4302 01/06/2006 100.00 0.00 180.00
> 4302 01/07/2006 100.00 0.00 280.00
>
>
> El tema es la columna SALDO donde se acumula. Y al cambiar de cuenta el
> saldo se vuelve 0 además, como cuando cambia de 4301 a 4302
>
>
> No me doy cuenta como lo podrí­a hacer en la misma consulta, obviamente a
> mano lo teje cualquiera ;)
>
> Un saludo

Columna de saldo acumulado

Publicado: Vie Sep 29, 2006 8:59 pm
por jose.luis
Carlos,
Me pillaste!! No leí bien tu enunciado.
Vista la nueva problemática.... no se que responderte. Pero buscando por
google... ahí van enlaces que pueden ayudarte:
http://www.forosdelweb.com/showthread.php?t=414753
http://www.configuracionesintegrales.co ... riggers.as p?articulo=5
Bueno... solo he visto estos dos que sean más o menos interesantes.
Saludos,
José Luis Capel
"Carlos Mora" <carlosmora@iespana.es> escribió en el mensaje
news:[email=451d563c@news.xailer.com...]451d563c@news.xailer.com...[/email]
> José Luis,
>> Cuenta Fecha Debe Haber
>> 4301 01012006 100 200
>> 4302 01012006 25 15
>>
>> Y quieres como resultado
>> Cuenta Fecha Saldo
>> 4301 01012006 300
>> 4302 01012006 35
>>
>> Prueba esto:
>>
>> SELECT cuenta, fecha, (debe+haber) as saldo FROM Cuentas
> No mi estimadísimo! Esa la sé!!
>
>
> La cosa es que dados
>
> Cuenta Fecha Debe Haber
> 4301 01/01/2006 100.00 0.00
> 4301 01/02/2006 120.00 0.00
> 4301 03/05/2006 10.00 0.00
> 4301 06/05/2006 0.00 30.00
> 4301 24/05/2006 0.00 120.00
> 4301 01/06/2006 100.00 0.00
> 4301 01/07/2006 100.00 0.00
> 4302 01/01/2006 100.00 0.00
> 4302 01/02/2006 120.00 0.00
> 4302 03/05/2006 10.00 0.00
> 4302 06/05/2006 0.00 30.00
> 4302 24/05/2006 0.00 120.00
> 4302 01/06/2006 100.00 0.00
> 4302 01/07/2006 100.00 0.00
>
> efectuar una consulta que obtenga el extracto de la cuenta con una columna
> de saldo acumulado
>
>
> Cuenta Fecha Debe Haber Saldo
> 4301 01/01/2006 100.00 0.00 100.00
> 4301 01/02/2006 120.00 0.00 220.00
> 4301 03/05/2006 10.00 0.00 230.00
> 4301 06/05/2006 0.00 30.00 200.00
> 4301 24/05/2006 0.00 120.00 80.00
> 4301 01/06/2006 100.00 0.00 180.00
> 4301 01/07/2006 100.00 0.00 280.00
> 4302 01/01/2006 100.00 0.00 100.00
> 4302 01/02/2006 120.00 0.00 220.00
> 4302 03/05/2006 10.00 0.00 230.00
> 4302 06/05/2006 0.00 30.00 200.00
> 4302 24/05/2006 0.00 120.00 80.00
> 4302 01/06/2006 100.00 0.00 180.00
> 4302 01/07/2006 100.00 0.00 280.00
>
>
> El tema es la columna SALDO donde se acumula. Y al cambiar de cuenta el
> saldo se vuelve 0 además, como cuando cambia de 4301 a 4302
>
>
> No me doy cuenta como lo podría hacer en la misma consulta, obviamente a
> mano lo teje cualquiera ;)
>
> Un saludo

Columna de saldo acumulado

Publicado: Vie Sep 29, 2006 9:10 pm
por Carlos Mora
Manu escribió:
> Aveces es mejor crear una tabla auxiliar y luego por ejemplo una vista
> de la tabla auxiliar y la tabla original.
> Realmente por el tiempo de proceso no tiene que ser muy grande...
Seguro que con tablas auxiliares se puede, pero la cuestión está en que
este tipo de consultas se me presenta seguido, y como soy novato con el
tema por ahí­ existe la forma de hacerlo directamente dentro del select.
Vienes en noviembre a la reunión?
un saludo,
Carlos.

Columna de saldo acumulado

Publicado: Vie Sep 29, 2006 9:24 pm
por Carlos Mora
José Luis,
> Vista la nueva problemática.... no se que responderte. Pero buscando por
> google... ahí­ van enlaces que pueden ayudarte:
>
> http://www.forosdelweb.com/showthread.php?t=414753
> http://www.configuracionesintegrales.co ... riggers.as p?articulo=5
>
> Bueno... solo he visto estos dos que sean más o menos interesantes.
Muchí­simas gracias. He leido los dos artí­culos y la solución no es muy
práctica que digamos. Que extraño que no haya una forma directa de hacer
eso, no?
Un saludo,
Carlos

Columna de saldo acumulado

Publicado: Vie Sep 29, 2006 9:29 pm
por jose.luis
Carlos,
>
> Muchí­simas gracias. He leido los dos artí­culos y la solución no es muy
> práctica que digamos. Que extraño que no haya una forma directa de hacer
> eso, no?
>
Bueno... no se si es extraño o no... Pero, desde mi cortita experiencia,
puede tener su sentido dado que los acumuladores no saben que fila hay
antes ni después.
De hecho, tampoco existe nada parecido en xbase.
Saludos,
José Luis Capel

Columna de saldo acumulado

Publicado: Vie Sep 29, 2006 10:50 pm
por Carlos Mora
José Luis
> Bueno... no se si es extraño o no... Pero, desde mi cortita experiencia,
> puede tener su sentido dado que los acumuladores no saben que fila hay
> antes ni después.
No serí­a necesario conocer el orden ya que es una función que se aplica
a la consulta, de forma similar a count(), sum(), avg(), etc, que
calculan el resultado sobre los grupos o toda la consulta. Si la funcion
ACCUM(debe-haber) existiese, listo el pollo. Serí­a similar a ir dejando
en la columna el valor que se va calculando para la función SUM(), ni
más ni menos.
Buscando ACUMM() encontré la funcion en la lista de mysql, como UDF. Me
queda como deberes para la casa ver como la cuelgo en el servidor.
Saludos.

Columna de saldo acumulado

Publicado: Vie Sep 29, 2006 11:06 pm
por Carlos Mora
José Luis,
> Bueno... no se si es extraño o no... Pero, desde mi cortita experiencia,
> puede tener su sentido dado que los acumuladores no saben que fila hay
> antes ni después.
>
> De hecho, tampoco existe nada parecido en xbase.
Era cuestión de buscar, nomás.
Para MySQL:
set @total:=0;
select cuenta, fecha,debe, haber, @total:=AmtPaid+@total as Saldo
from MAYOR where ...;
faltaba saber la historia de usar variables nomás. Gracias por tu interés,
Carlos

Columna de saldo acumulado

Publicado: Sab Sep 30, 2006 12:08 am
por Carlos Mora
perdón,
> set @total:=0;
> select cuenta, fecha,debe, haber, @total:=AmtPaid+@total as Saldo from
> MAYOR where ...;
select cuenta, fecha, debe, haber, @total:= debe - haber + @total as
Saldo from MAYOR where ...;

Columna de saldo acumulado

Publicado: Sab Sep 30, 2006 12:25 am
por Manu
Carlos si usas MySQL no hay problema, pero si te sales del SQL estanadar
no lo podrás aplicar a otros sistemas de bases de datos basados en SQL...
Voy a intentar ir por todos los medios... tu vas seguro no?
Carlos Mora escribió:
> perdón,
>> set @total:=0;
>> select cuenta, fecha,debe, haber, @total:=AmtPaid+@total as Saldo
>> from MAYOR where ...;
>
>
> select cuenta, fecha, debe, haber, @total:= debe - haber + @total as
> Saldo from MAYOR where ...;

Columna de saldo acumulado

Publicado: Sab Sep 30, 2006 1:38 am
por Carlos Mora
Manu
> Carlos si usas MySQL no hay problema, pero si te sales del SQL estanadar
> no lo podrás aplicar a otros sistemas de bases de datos basados en SQL...
Usar SQL de manera compatible con todos los motores es algo que veo
bastante dificil. De entrada todos van a su bola con los
autoincrementales, y como esa diferencia encontramos una de cada color.
> Voy a intentar ir por todos los medios... tu vas seguro no?
Lo tengo un poco fácil, trabajo en Atisa, asi es que... seguro seguro
estoy allí­.
Un saludo

Columna de saldo acumulado

Publicado: Sab Sep 30, 2006 10:57 am
por ignacio
Carlos,
Si te funciona, estupendo. Pero juraría que lo que quieres hacer con
variables no es posible. Ya que la clásula ORDER BY es la última que se
evalua en cualquier comando SQL. Por lo tanto, en principio sólo te
funcionaría cuando la ordenación coincidiese con la clave primaria y esta
fuese utilizada igualmente para el salvado físico de los registros
(clustered-index).
Un saludo,
"Carlos Mora" <carlosmora@iespana.es> wrote in message
news:[email=451d8ab7@news.xailer.com...]451d8ab7@news.xailer.com...[/email]
> José Luis,
>
>> Bueno... no se si es extraño o no... Pero, desde mi cortita experiencia,
>> puede tener su sentido dado que los acumuladores no saben que fila hay
>> antes ni después.
>>
>> De hecho, tampoco existe nada parecido en xbase.
>
> Era cuestión de buscar, nomás.
>
> Para MySQL:
>
> set @total:=0;
> select cuenta, fecha,debe, haber, @total:=AmtPaid+@total as Saldo from
> MAYOR where ...;
>
> faltaba saber la historia de usar variables nomás. Gracias por tu interés,
>
> Carlos

Columna de saldo acumulado

Publicado: Dom Oct 01, 2006 11:23 am
por Carlos Mora
Ignacio,
> Si te funciona, estupendo. Pero jurarí­a que lo que quieres hacer con
> variables no es posible. Ya que la clásula ORDER BY es la última que se
> evalua en cualquier comando SQL. Por lo tanto, en principio sólo te
> funcionarí­a cuando la ordenación coincidiese con la clave primaria y esta
> fuese utilizada igualmente para el salvado fí­sico de los registros
> (clustered-index).
No hace falta que jures, te creo ;) Es cierto que no se puede presumir
ningun ordenamiento hasta la salida, pero creo que se solucionarí­a
haciendo el select previo ordenado:
set @total:=0;
select cuenta, fecha,debe, haber, @total:= debe-haber+@total as Saldo from
( select cuenta, fecha, debe, haber from Mayor ORDER BY cuenta, fecha
WHERE ... )
De todas maneras, el tema era ver como resolver una columna de
acumulados en la misma consulta, que es un patron de consultas bastante
frecuente y que no está contemplado en el SQL estandar.
Solo por curiosidad y aprovechando tu conocimiento de MS SQL Server: ¿Se
pueden usar las variables así­ como en el ejemplo (dialecto MySQL) ?
Un saludo,
Carlos.

Columna de saldo acumulado

Publicado: Dom Oct 01, 2006 12:29 pm
por miguel
Hola:
en SQL server me da este mensaje
No debe combinarse una instrucción SELECT que asigne un valor a una
variable con operaciones de recuperación de datos.
Miguel A. Torrellas
Carlos Mora escribió:
> José Luis,
>
>> Bueno... no se si es extraño o no... Pero, desde mi cortita experiencia,
>> puede tener su sentido dado que los acumuladores no saben que fila hay
>> antes ni después.
>>
>> De hecho, tampoco existe nada parecido en xbase.
>
> Era cuestión de buscar, nomás.
>
> Para MySQL:
>
> set @total:=0;
> select cuenta, fecha,debe, haber, @total:=AmtPaid+@total as Saldo from
> MAYOR where ...;
>
> faltaba saber la historia de usar variables nomás. Gracias por tu interés,
>
> Carlos

Columna de saldo acumulado

Publicado: Dom Oct 01, 2006 11:21 pm
por Manu
Si usa un procedimiento almacenado sí­ seguro...
Carlos Mora escribió:
> Ignacio,
>> Si te funciona, estupendo. Pero jurarí­a que lo que quieres hacer con
>> variables no es posible. Ya que la clásula ORDER BY es la última que
>> se evalua en cualquier comando SQL. Por lo tanto, en principio sólo te
>> funcionarí­a cuando la ordenación coincidiese con la clave primaria y
>> esta fuese utilizada igualmente para el salvado fí­sico de los
>> registros (clustered-index).
> No hace falta que jures, te creo ;) Es cierto que no se puede presumir
> ningun ordenamiento hasta la salida, pero creo que se solucionarí­a
> haciendo el select previo ordenado:
>
> set @total:=0;
> select cuenta, fecha,debe, haber, @total:= debe-haber+@total as Saldo from
> ( select cuenta, fecha, debe, haber from Mayor ORDER BY cuenta, fecha
> WHERE ... )
>
> De todas maneras, el tema era ver como resolver una columna de
> acumulados en la misma consulta, que es un patron de consultas bastante
> frecuente y que no está contemplado en el SQL estandar.
>
> Solo por curiosidad y aprovechando tu conocimiento de MS SQL Server: ¿Se
> pueden usar las variables así­ como en el ejemplo (dialecto MySQL) ?
>
> Un saludo,
>
> Carlos.

Columna de saldo acumulado

Publicado: Lun Oct 02, 2006 10:37 am
por Carlos Mora
Manu,
> Si usa un procedimiento almacenado sí­ seguro...
pero según Miguel no se puede en un select, asi es que habrá que definir
la función ACUM... si es que no la tiene ya.
Por lo visto hay implementaciones de esa función como UDF para MySQL,
postgres y firebird, por lo que no serí­a extraño que ya la tengas
disponible.
Saludos

Columna de saldo acumulado

Publicado: Lun Oct 02, 2006 8:36 pm
por Carlos Mora
Miguel,
> en SQL server me da este mensaje
>
> No debe combinarse una instrucción SELECT que asigne un valor a una
> variable con operaciones de recuperación de datos.
Lo mio es rayano al onanismo mental, dijera Antonio Ortega :)
La solución genérica es via una theta join, y usando el ID como parte
del orden, ya que se requiere una clave única para cada registro
select
t1.id, t1.cuenta, t1.fecha, t1.debe, t1.haber, sum( t2.debe ) as
TDebe, Sum(t2.haber)as THaber, tdebe-thaber
from
Mayor as t1 inner join Mayor as t2 on (t1.cuenta, t1.fecha, t1.id)
>= ( t2.cuenta, t2.fecha, t2.id ) group by t1.cuenta, t1.fecha, t1.id
order by t1.cuenta, t1.fecha, t1.id
No estoy seguro si con SQL server se pueden poner las comparaciones como
las puse en parentesis, pero la idea creo que se entiende y si no
funciona serí­a cuestion de currársela haciendo la comparacion a pelo
t1.cuenta > t2.cuenta or ( ( t1. cuenta = t2.cuenta ) and ( t1.fecha
>t2.fecha OR (t1.fecha=t2.fecha AND t1.id >= t2.ID) ) )

Columna de saldo acumulado

Publicado: Lun Oct 02, 2006 9:15 pm
por ignacio
Carlos,
En mi opinión la única forma de hacerlo es que la columna de saldo sea otra
select que SUME los saldos hasta el mismo registro que procesa. Mira la
documentación de la BD que estes usando para hacer SELECTS anidados.
En cualquier caso te puedes imaginar que como haya muchas filas al servidor
le puede hacer bastante pupa, y tiene sentido que calcules tu el saldo en
vez del servidor.
Un saludo,
"Carlos Mora" <carlosmora@iespana.es> wrote in message
news:[email=45215c1f@news.xailer.com...]45215c1f@news.xailer.com...[/email]
> Miguel,
>
>> en SQL server me da este mensaje
>>
>> No debe combinarse una instrucción SELECT que asigne un valor a una
>> variable con operaciones de recuperación de datos.
>
> Lo mio es rayano al onanismo mental, dijera Antonio Ortega :)
>
> La solución genérica es via una theta join, y usando el ID como parte del
> orden, ya que se requiere una clave única para cada registro
>
> select
> t1.id, t1.cuenta, t1.fecha, t1.debe, t1.haber, sum( t2.debe ) as TDebe,
> Sum(t2.haber)as THaber, tdebe-thaber
> from
> Mayor as t1 inner join Mayor as t2 on (t1.cuenta, t1.fecha, t1.id)
> >= ( t2.cuenta, t2.fecha, t2.id ) group by t1.cuenta, t1.fecha, t1.id
> order by t1.cuenta, t1.fecha, t1.id
>
> No estoy seguro si con SQL server se pueden poner las comparaciones como
> las puse en parentesis, pero la idea creo que se entiende y si no funciona
> sería cuestion de currársela haciendo la comparacion a pelo
>
> t1.cuenta > t2.cuenta or ( ( t1. cuenta = t2.cuenta ) and ( t1.fecha
> >t2.fecha OR (t1.fecha=t2.fecha AND t1.id >= t2.ID) ) )