Seleccionar últimos registros de una Tabla
#1
Posted 03 September 2014 - 09:13 AM
Verán estoy haciendo una base de datos para mi viejo para su trabajo, y llegué a un punto en que debo hacer una consulta e informe que me ha roto la cabeza.
Tengo las siguientes tablas:
Expedientes -1---M- MovimientosEstadosExpediente -M---1- EstadoExpte
La tabla Movimientos contiene los campos
IDMovimiento (PK)
ExpteID (FK > Expedientes.IDExpediente)
EstadoID (FK > EstadoExpteIDEstado)
Fecha
Observaciones
La tabla Expedientes contiene
IDExpediente (FK)
Código
Número
Descripción
...
La tabla EstadoExpte contiene
IDEstado (OK)
Nombre
Por naturaleza del problema no es posible hacer que Código y/o Número fueran una PK. Necesariamente se debe hacer uso de esa clave artificial ID. Ya que código es una nomeclatura para identificar una zona y el número a los catrastos. Y como es de esperar hay diversas combinaciones aceptables de éstos.
¿Que necesito? Realizar una consulta que me extraiga el último estado de cada expediente. Es decir esto:
CodExpte - NumExpte - DescripcionExpte - UltimoEstado - FechaUltimoEstado
Por tanto si para el Expte ID 10 (por dar un número) tuviera 3 movimientos ingresados (12/09/14, 26/07/14, 03/10/14), me regresara aquel correspondiente a de la última fecha (03/10/14). Y así por cada expediente.
Ya tengo el historial completo, lo que no logro coordinar es mi cerebro para que arme esta consulta en particular. Y el asistente de consultas de Access no me sabe entender. Empleo Access 2010.
Una guía muchachos.
Que mal hace la falta de práctica. Ya ni SQL recuerdo.
Saludos,
#2
Posted 03 September 2014 - 09:32 AM
Ordena descendente y obten sólo el First 1
Saludos
Edito, no va a funcionar
#3
Posted 03 September 2014 - 09:36 AM
Vamos amigo, tu puedes... Intento N° 2. Esta consulta tiene que salir... a ver las cabezas porque yo evidentemente no tengo.Una idea rápida y que puede no funcionar
Ordena descendente y obten sólo el First 1
Saludos
Edito, no va a funcionar
Saludos,
#4
Posted 03 September 2014 - 09:37 AM
Saludox !
#5
Posted 03 September 2014 - 09:39 AM
Porque el FIRTS 1 va a ser que se quede en el 1er expediente. Y yo necesito que por cada expediente me traiga el último movimiento registrado.Porqué no ?
Saludox !
Saludos,
#6
Posted 03 September 2014 - 09:41 AM
SELECT IDMovimiento, ExpteID, EstadoID, MAX(Fecha) FROM TU_TABLA GROUP BY 1,2,3
Saludos
#7
Posted 03 September 2014 - 09:50 AM
Obteniendo el max(fecha)
sql
SELECT IDMovimiento, ExpteID, EstadoID, MAX(Fecha) FROM TU_TABLA GROUP BY 1,2,3
Saludos
No funciona
Parece simple el problema pero rompe cabeza.
Saludos,
#8
Posted 03 September 2014 - 09:50 AM
Porque el FIRTS 1 va a ser que se quede en el 1er expediente. Y yo necesito que por cada expediente me traiga el último movimiento registrado.
Porqué no ?
Saludox !
Saludos,
Obviamente tendrías que acomodarlo de manera descendente ... así tendrás el último...
Ahora obviamente tienes que especificar qué movimiento necesitas, si no, te pondrá el último registro de todos... puedes hacer dos consultas anidadas
Saludox !
#9
Posted 03 September 2014 - 09:53 AM
Obteniendo el max(fecha)
sql
SELECT IDMovimiento, ExpteID, EstadoID, MAX(Fecha) FROM TU_TABLA GROUP BY 1,2,3
Saludos
No funciona
Parece simple el problema pero rompe cabeza.
Saludos,
Supuse que los primeros tres datos serían iguales, porque debería de funcionar, a mi me funcionó.
Saludos
#10
Posted 03 September 2014 - 09:54 AM
Porque el FIRTS 1 va a ser que se quede en el 1er expediente. Y yo necesito que por cada expediente me traiga el último movimiento registrado.
Porqué no ?
Saludox !
Saludos,
Obviamente tendrías que acomodarlo de manera descendente ... así tendrás el último...
Ahora obviamente tienes que especificar qué movimiento necesitas, si no, te pondrá el último registro de todos... puedes hacer dos consultas anidadas
Saludox !
Ummm. ¿Como sería más o menos? Estuve pensando en buscarle la vuelta por consulta anidada pero no concebí la forma.
Saludos,
#11
Posted 03 September 2014 - 09:59 AM
SELECT movs.id_movimiento, ( SELECT FIRST 1 aux.fecha_movimiento FROM tabla_movimientos aux WHERE aux.id_movimiento = movs.id_movimiento ORDER BY aux.fecha_movimiento DESC ) fecha_movimiento FROM tabla_movimientos movs
Se me ocurre que así podría ser
Saludox !
#12
Posted 03 September 2014 - 10:02 AM
Saludox !
#13
Posted 03 September 2014 - 10:03 AM
Pues no son iguales.Supuse que los primeros tres datos serían iguales, porque debería de funcionar, a mi me funcionó.
Saludos
Código y Número pueden variar. En realidad para un diseño más exquisito debiera haber una tabla más pero ya era bastante complicado. Te explico, en realidad el número del expediente debiera ser el ID, el asunto es que puede tenerse el mismo numero de expediente pero asociado a otro código. Y para un código en particular van a ver muchos. Podría hacerse una clave compuesta pero aquí nos manejamos mayormente con expedientes de una zona en particular y para males resulta ser que en ocasiones el código no es conocido y debemos recuperar o esperar a que el organismo controlador nos pase estos valores.
Todo esto llevo a que se disponga de 2 campos.
Es en realidad una relación (M:M) entre Código y Número pero para hacerlo más manejable es preferible llevarlo así.
Por ejemplo 18-12345 es uno, pero puede haber un 12345 en codigo 23.
¿Me explico?
Saludos,
#14
Posted 03 September 2014 - 10:07 AM
En un rato pruebo. Podría funcionar.Algo así: (perdón por no respetar la estructura, pero la idea es esa)
sql
SELECT movs.id_movimiento, ( SELECT FIRST 1 aux.fecha_movimiento FROM tabla_movimientos aux WHERE aux.id_movimiento = movs.id_movimiento ORDER BY aux.fecha_movimiento DESC ) fecha_movimiento FROM tabla_movimientos movs
Se me ocurre que así podría ser
Saludox !
Saludos,
#15
Posted 03 September 2014 - 10:43 AM
Gaby, recibo como error "Ha intentato ejecutar una consulta que no incluye la expresión especificada "Aux.Fecha_movimiento" como parte de una función de agregado".
EDITO: Ya vi el error, era reemplazar ORDER BY 1 en lugar de llamarlo por nombre.
Pero si bien ahora no recibo el error, sigo recibiendo todos los registros.
Saludos,
#16
Posted 03 September 2014 - 11:14 AM
SELECT Expedientes.Codigo, Expedientes.Numero, Expedientes.Descripcion, Estados.Estado AS ULTIMO_ESTADO, movimientos.Fecha AS ULTIMA_FECHA_ESTADO FROM Estados INNER JOIN (Expedientes INNER JOIN movimientos ON Expedientes.IdExpediente = movimientos.ExpteId) ON Estados.idEstado = movimientos.EstadoId WHERE MOVIMIENTOS.IDMOVIMIENTO IN(SELECT Max(MOVIMIENTOS.IDMOVIMIENTO) AS MáxDeIDMOVIMIENTO FROM MOVIMIENTOS GROUP BY MOVIMIENTOS.EXPTEID;)
La primera parte puedes organizarla a tu gusto, la importante es la segunda que es la que devuelve los ids necesarios en la consulta.
Saludos.
#17
Posted 03 September 2014 - 11:22 AM
SELECT TablaExptes.ExpteCod AS Código, TablaExptes.ExpteNro AS Número, TablaExptes.Descripción AS Descripción, TablaEstadosExpte.Nombre AS Estado, TablaMovimientosExptes.FechaRevision AS Fecha, TablaMovimientosExptes.Observaciones AS Observaciones FROM TablaExptes INNER JOIN (TablaEstadosExpte INNER JOIN TablaMovimientosExptes ON TablaEstadosExpte.[IDEstado] = TablaMovimientosExptes.[EstadoID]) ON TablaExptes.[IDExpte] = TablaMovimientosExptes.[ExpteID] ORDER BY TablaExptes.ExpteCod, TablaExptes.ExpteNro, TablaMovimientosExptes.FechaRevision DESC;
Bueno, similar a eso, lo que ando buscando es quedarme solamente con el movimiento fechado.
Gracias Wilson por participar. Voy a probar tu consulta a ver que resulta.
Les agradezco a todos su colaboración y estar robándoles el tiempo.
Saludos,
#18
Posted 03 September 2014 - 12:07 PM
Probando variaciones menores de los campos, como por ejemplo sacándolo a ese, sigue con errores de JOIN. Y ahora señala como culpable a la tabla Movimientos justo delante del INNER JOIN.
Cosa mandinga Examino donde está la metida de pata y no le veo un porqué.
Saludos,
#19
Posted 03 September 2014 - 12:45 PM
A partir de esta lista seleccionar los expedientes y mediante un JOIN obtener los estados.
Esa se supone es la solución, pero no se si puede funcionar en Access.
También tengo mi lío en la cabeza como para escribir la sentencia.
SELECT BLA BLA BLA FROM EXPEDIENTES INNER JOIN ESTADOS FROM SELECT DISTINCT 1 IDEXP ORDER BY DIAMODIF DESC ... FROM MODIFICACION
Perdón esa es mi idea, me complica no tener a mano los nombres de los campos y las tablas, ya que al contestar no puedo ver el mensaje original.
Salufos.
#20
Posted 03 September 2014 - 01:06 PM
Wilson, tu consulta da error de sintaxis en JOIN y señala el error sobre el campo ULTIMA_FECHA_ESTADO. Algo raro por lo que a la vista todo induce a que está bien.
Probando variaciones menores de los campos, como por ejemplo sacándolo a ese, sigue con errores de JOIN. Y ahora señala como culpable a la tabla Movimientos justo delante del INNER JOIN.
Cosa mandinga Examino donde está la metida de pata y no le veo un porqué.
Saludos,
La acabo de probar en Access 2010 y trabaja perfectamente, adjunto db de ejemplo.
SELECT Expedientes.Codigo, Expedientes.Numero, Expedientes.Descripcion, Estados.Estado AS ULTIMO_ESTADO, movimientos.Fecha AS ULTIMA_FECHA_ESTADO FROM Estados INNER JOIN (Expedientes INNER JOIN movimientos ON Expedientes.IdExpediente = movimientos.ExpteId) ON Estados.idEstado = movimientos.EstadoId WHERE MOVIMIENTOS.IDMOVIMIENTO IN(SELECT Max(MOVIMIENTOS.IDMOVIMIENTO) AS MáxDeIDMOVIMIENTO FROM MOVIMIENTOS GROUP BY MOVIMIENTOS.EXPTEID;);
Revisa algún paréntesis, alguna coma, algún nombre de campo o algún nombre de tabla. Igual la primera parte puedes hacerla a gusto, la que tiene la crema del asunto es la que está después del WHERE, que es la que devuelve los IDS de los últimos movimientos de cada expediente.
Saludos