Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

relación de movimientos - saldos

Estas en el tema de relación de movimientos - saldos en el foro de Mysql en Foros del Web. Buenas colegas, necesito hacer una consulta de los saldos de todos los clientes que esta en una tabla "saldos" pero necesito extraer la última fecha ...
  #1 (permalink)  
Antiguo 03/06/2010, 14:59
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 11 meses
Puntos: 9
relación de movimientos - saldos

Buenas colegas, necesito hacer una consulta de los saldos de todos los clientes que esta en una tabla "saldos" pero necesito extraer la última fecha que hizo algún pago o compra (osea movimiento), la relación es asi:

Código:
(saldos:)
CLI ID |  SALDO |
--------    ---------
  001       200.00
  002       50.00

(movimientos)
FECHA          | CLI ID | ABONO | CARGO ...
----------------  --------   ---------    --------
2010-05-11      001     100.00     00.00
2010-05-10      001      00.00      300.00
2010-04-12      002      10.00      60.00
Mi idea es que en la lista de saldos me quede asi:

Código:
CLI ID | SALDO | ULT. MOV 
--------   --------    --------
001       200.00   2010-05-11
002       50.00     2010-04-12
He logrado aplicar esto son con un WHERE a un ID de cliente:

Código:
SELECT a.fecha, a.cliente_id, c.saldo
FROM movimiento a INNER JOIN saldo c ON a.cliente_id=c.cliente_id WHERE a.cliente_id ='001' ORDER BY a.fecha DESC LIMIT 1
Pero es posible insertar la última fecha en un listado de todos los clientes? con un procedimiento almacenado quizás? espero me puedan ayudar!
__________________
Quitenme la vida pero no la bebida.
  #2 (permalink)  
Antiguo 07/06/2010, 00:20
 
Fecha de Ingreso: junio-2008
Mensajes: 122
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: relación de movimientos - saldos

Podes probar lo siguiente:

SELECT movimientos.cli ID, saldos.saldo, movimientos.fecha AS ultimo_movimiento
FROM movimientos JOIN saldos ON movimientos.cli ID = saldos.cli ID

Hasta ahi te da todos los clientes con su saldo y todos los movimientos.
Pero si le agregamos un ORDER BY cli ID ASC, ultimo_movimiento ASC nos lo va a ordenar primero por cliente y luego, dentro del mismo cliente, por fecha.

Finalmente si le agregamos GROUP BY movimientos.cli ID nos daria lo que estas buscando.

Sino te recomiendo que investigues con SELECT DISTINCT a ver a que puerto llegas.
Suerte!
  #3 (permalink)  
Antiguo 07/06/2010, 09:46
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 11 meses
Puntos: 9
Respuesta: relación de movimientos - saldos

Hola man disculpa la demora pero estaba un poco delicado de salud. Bueno probe el query y al parecer funcionó:

Código:
SELECT m.cliente_id, s.saldo m.movimiento_fecha AS ultimo_movimiento
FROM movimiento m JOIN saldo s ON m.cliente_id = s.cliente_id
GROUP BY m.cliente_id
ORDER BY cliente_id ASC, ultimo_movimiento ASC
Pero verificando la data... en vez de devolverme la última fecha me devuelve la primera, intenté ponerle DESC en el ORDER del ultimo_movimiento pero me retorna lo mismo... a que se debe?

Espero me puedas ayudar, gracias!
__________________
Quitenme la vida pero no la bebida.
  #4 (permalink)  
Antiguo 07/06/2010, 13:43
 
Fecha de Ingreso: diciembre-2008
Ubicación: Perú
Mensajes: 20
Antigüedad: 16 años
Puntos: 0
Respuesta: relación de movimientos - saldos

Lo que falta es agregarle una condicion mas m.Fecha=(select Max(m.Fecha) from movimiento m,saldo s where c.CLIID=s.CLIID )
dentro de tu where a ver pruebalo....
  #5 (permalink)  
Antiguo 07/06/2010, 14:24
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 11 meses
Puntos: 9
Respuesta: relación de movimientos - saldos

Hola, si te refieres al primer query, si yo pongo el WHERE con esa condición (como entendi):

Código:
SELECT a.movimiento_fecha, a.cliente_id, c.saldo
FROM movimiento a INNER JOIN saldo c ON a.cliente_id=c.cliente_id
WHERE a.movimiento_fecha = (SELECT MAX(m.movimiento_fecha) FROM movimiento m, saldo s WHERE m.cliente_id = s.cliente_id)
Me retorna sólo un registro que contiene la fecha más reciente de todas....
__________________
Quitenme la vida pero no la bebida.
  #6 (permalink)  
Antiguo 07/06/2010, 17:03
 
Fecha de Ingreso: diciembre-2008
Ubicación: Perú
Mensajes: 20
Antigüedad: 16 años
Puntos: 0
Respuesta: relación de movimientos - saldos

En vez de = es IN...disculpa
  #7 (permalink)  
Antiguo 07/06/2010, 17:19
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 11 meses
Puntos: 9
Respuesta: relación de movimientos - saldos

Pues lo probé con IN y me retorna el mismo resultado (un solo registro que contiene la más reciente fecha) ... creo que el problema está en el

(SELECT MAX(m.movimiento_fecha) FROM movimiento m, saldo s WHERE m.cliente_id = s.cliente_id)

Seguiré probando ....
__________________
Quitenme la vida pero no la bebida.
  #8 (permalink)  
Antiguo 08/06/2010, 01:28
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: relación de movimientos - saldos

Cesarpunk,
No lo he probado. Comprueba los nombres de los campos.
SELECT s.cli_id, s.saldo, t1.fecha ULT_MOV FROM saldos s INNER JOIN (SELECT cli_id, fecha FROM movimientos ORDER BY id, fecha DESC)t1 ON s.cli_id=t1.cli_id GROUP BY s.cli_id ORDER BY s.cli_id
  #9 (permalink)  
Antiguo 09/06/2010, 15:25
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 11 meses
Puntos: 9
Respuesta: relación de movimientos - saldos

Pues sip, muchas gracias ese query si me funcionó, conseguí mostrar la última fecha y debido a la relación sólo muestro los clientes que han hecho algún movimiento. Muchas gracias
__________________
Quitenme la vida pero no la bebida.

Etiquetas: saldos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:18.