Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Como hacer una columna Acumulada en SQL (https://www.clubdelphi.com/foros/showthread.php?t=48202)

egarc 18-09-2007 18:28:34

Como hacer una columna Acumulada en SQL
 
Buenas, tengo el siguiente problemita:

Mi base de datos es sql server 2005, programo en delphi 2006, y uso ADO.

Tengo una tabla que se llama CTACTE (Cuenta Corriente) en la cual se guardan todos los movimientos (DEBITOS, CREDITOS, FACTURAS, PAGOS) de los clientes.
Sus campos son: Id_cliente, MontoMovimiento(si es un pago o una nota de crédito el valor es negativo), TipoMovimiento(DB,FAC,NC,PAG), Concepto, FechaEmision, Status(A ó N).

se muestra mas o menos asi cuando ejecuto los siguiente:
Código SQL [-]
Select * from CTACTE where Id_cliente=1
Código SQL [-]
 
ID_cliente    MontoMovimiento            TipoMovimiento            Concepto              FechaEmision
      1                    1,000.00                      FAC                        Factura                 08/08/2007
      1                     -500.00                       NC                         nota cre                01/09/2007
Perfecto, pero yo quiero que me salga una columna acumulando el balance del cliente, o que salga de esta forma:
Código SQL [-]
ID_cliente    MontoMovimiento            Acumulado           Concepto           FechaEmision
      1                    1,000.00                 1,000.00               Factura               08/08/2007
      1                     -500.00                   500.00                nota cre              01/09/2007
la columna que quiero calcular, es ACUMULADO, y no se como hacerlo


Sus aportes serían de gran ayuda.

Gracias Anticipadas

ContraVeneno 18-09-2007 19:30:29

No es cierto... dejame consulto

ContraVeneno 18-09-2007 20:10:49

Código SQL [-]
Select cast(F1.MontoMovimiento as money) as total,
cast(sum (F2.MontoMovimiento) as money) as Acumulativo
from CTACTE F1
join CTACTE F2 on (F1.MontoMovimiento > F2.MontoMovimiento) 
or (F1.MontoMovimiento = F2.MontoMovimiento and F1.Codigo= F2.Codigo)
Group By F1.MontoMovimiento

"Codigo" es el índice que identifica a cada registro

egarc 18-09-2007 20:16:35

no entendi nada......

ContraVeneno 18-09-2007 20:19:30

Código SQL [-]
Select C1.MontoMovimiento, Sum(C2.MontoMovimiento)
from CTACTE C1
join CTACTE C2 on (C1.MontoMovimiento > C2.MontoMovimiento) or (C1.MontoMovimiento = C2.MontoMovimiento)
Group By C1.MontoMovimiento
Order by C1.MontoMovimiento

Más claro, ya no puedo

egarc 18-09-2007 20:32:53

Muchas gracias, es exactamente lo que buscaba.....:D

egarc 18-09-2007 21:32:25

es exactamento lo que buscaba, pero.....los datos que me arroja no son reales la columan ACUMULADO...

Probé el código, a simple vista vi que me daba datos, pero luego detalladamente no fue así....

:(

ContraVeneno 18-09-2007 23:19:09

Pues yo lo probé y sí me da los datos exactos de un acumulado.
http://www.geocities.com/bodokike/acumulado.jpg

¿te tomaste la molestia de analizar lo que propuse?

¿sabes para qué es el cast?

La primer consulta utiliza un campo "código" que en tu ejemplo, "código" debería ser el campo llave de tu tabla. Debes de tener cuidado con la forma en que lo ordenas y especialmente con la parte:
Código SQL [-]
C1.MontoMovimiento > C2.MontoMovimiento
Dependiendo de como lo ordenes, sera un ">" o un "<".

Vamos, que esto no se trata de copiar y pegar.

Ahora bien, exactamente: ¿porque dices que los datos no son reales? ¿no te los suma? ¿no están en orden? ¿no sale nada?
y principalmente:
¿cómo adaptaste el ejemplo a tu código?

egarc 19-09-2007 18:39:10

Código SQL [-]
Select c1.id, c1.monto,Sum(C2.Monto)as Acumulado, C1.FechaEmision, C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion, C1.Tipo,C1.NumeroControl
from CTACTE C1
join CTACTE C2 on (C1.Monto < C2.Monto) or (C1.Monto = C2.Monto) 
where (c1.cod_cliente=1)and (c2.cod_cliente=1)
Group By C1.FechaEmision, C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion, c1.id ,C1.Tipo,C1.NumeroControl, c1.monto,C1.Id
Order by C1.id

Id es el campo que me dice el orden en que entraron a la tabla las transacciones....es autonumérico..

este es el SQL que estoy ejecutanto, pero....

la columna acumulado, no sale debidamente ordenada...

entiendo todo el sql que pusiste.....

Gracias anticipadas

ContraVeneno 19-09-2007 18:51:49

Código SQL [-]
Select c1.id, c1.monto,Sum(C2.Monto)as Acumulado, C1.FechaEmision, C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion, C1.Tipo,C1.NumeroControl
from CTACTE C1
join CTACTE C2 on (C1.Monto > C2.Monto) or (C1.Monto = C2.Monto and C1.Cod_Cliente = C2.Cod_Cliente and C1.ID = C2.ID)
where c1.cod_cliente=1
Group By C1.FechaEmision, C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion, c1.id ,C1.Tipo,C1.NumeroControl, c1.monto,C1.Id
Order by C1.id

egarc 19-09-2007 21:04:44

me dio lo mismo! :confused:

ContraVeneno 19-09-2007 23:02:35

no pues ahí sí ya no te puedo ayudar. Necesitaría conocer tu sistema de base de datos y toda la estructura para saber exactamente que esta pasando. Pero así desde aquí, no tengo la más mínima idea.

egarc 19-09-2007 23:55:26

Gracias de todas formas.....

pero, no habrá otra forma, por ejemplo con un campo calculado....o algo asi??

si conoces alguna, por favor!!

Gracias :(

Ivanzinho 20-09-2007 10:32:51

Código SQL [-]
Select c1.id, c1.monto,Sum(C2.Monto)as Acumulado, C1.FechaEmision, 
         C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion,  
         C1.Tipo,C1.NumeroControl
from CTACTE C1 inner join CTACTE C2 on (C1.id >= C2.id) 
where c1.cod_cliente = 1
Group By C1.FechaEmision, C1.Usuario, C1.NCF, 
             C1.NroComprobante,C1.Cod_actuacion, c1.id, 
             C1.Tipo, C1.NumeroControl, c1.monto, C1.Id
Order by C1.id

Prueba con esto, así te debería funcionar. Pero te aconsejaria que intentaras entender la consulta y no simplemente copiarla, ya que te lo dieron hecho, simplemente tenias que amoldarlo a tus necesidades. El problema es que ordenabas por id y en el join la comparación la hacias con monto. Intenta entenderlo, que así te valdrá de algo, y si no entiendes pregunta, ya sabes que aquí estamos para ayudarte.

Un saúdo.

egarc 21-09-2007 23:26:01

Amigo gracias, lo unico que le falto algo en el WHERE, que en C2.Cod_cliente=1
Código SQL [-]
Select c1.id, c1.monto,Sum(C2.Monto)as Acumulado, C1.FechaEmision,          
C1.Usuario, C1.NCF, C1.NroComprobante,C1.Cod_actuacion,          
C1.Tipo,C1.NumeroControlfrom CTACTE C1 inner join CTACTE C2 on (C1.id >= C2.id)
 where c1.cod_cliente = 1 and c2.cod_cliente = 1 Group By C1.FechaEmision, C1.Usuario, C1.NCF,              
C1.NroComprobante,C1.Cod_actuacion, c1.id,              
C1.Tipo, C1.NumeroControl, c1.monto, C1.IdOrder by C1.id


Muchisimas gracias...


La franja horaria es GMT +2. Ahora son las 18:15:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi