Consulta sql inner join con más de un resultado

Tengo una consulta en acces con inner join por id. En ésta calculo entre fechas los días que han pasado desde la última realización de un curso. El problema se produce cuando el trabajador en cuestión ha realizado el curso en más de una ocasión. Cómo es lógico me devuelve más de un resultado. Querría solo el resultado en base a la fecha del último curso realizado. He probado con subsconsulta pero no me sale. La consulta sería esta:

SELECT TbL_Plantilla.ID, TbL_Plantilla.[Apellido 1], TbL_Plantilla.[Apellido 2], TbL_Plantilla.Nombre, Tbl_Formacion.Curso, Tbl_Formacion.Fecha_Realizacion, Date()-[Fecha_Realizacion] AS [Dias desde Realizacion] FROM TbL_Plantilla INNER JOIN Tbl_Formacion ON TbL_Plantilla.ID = Tbl_Formacion.ID WHERE (((TbL_Plantilla.ID)=1067) AND ((Tbl_Formacion.Curso)="Practicas MOTO") AND ((Tbl_Formacion.Fecha_Realizacion) Between #1/1/2016# And #5/20/2020#) ORDER BY TbL_Plantilla.ID, TbL_Plantilla.[Apellido 1], Tbl_Formacion.Fecha_Realizacion; 

Ahora me retorna que el trabajador con ID 1067 ha hecho el mismo curso dos veces y me interesaría solo el registro en base a la fecha 07/06/2018 dado que genera confusión si se mira por días desde realización:

ID Curso Fecha_Realizacion Dias desde Realizacion
1067        Practicas Moto        01/01/2016                            1601
1067        Practicas Moto        07/06/2018                            713

1 Respuesta

Respuesta
1

Hay una forma "sencilla", que sería hacerlo en dos pasos:

Haces la consulta que relaciona las dos tablas, pero sin el campo calculado, y la conviertes en una consulta de totales. Como el único registro que te interesa mostrar es la de la fecha más reciente, agrupas el campo Fecha_Realizacion por Máximo, y el resto lo dejas en "agrupar por". Si ejecutas esa consulta, solo te debería mostrar el siguiente registro:

ID Curso MáxDeFecha_Realizacion 
1067        Practicas Moto        07/06/2018 

Luego creas una consulta sobre la anterior y ahí calculas el campo con la diferencia entre la fecha de sistema y la de realización.

Si lo quieres hacer en una sola consulta, a ver si así te funciona:

SELECT TbL_Plantilla.ID, TbL_Plantilla.[Apellido 1], TbL_Plantilla.[Apellido 2], TbL_Plantilla.Nombre, B.Curso, B.FR AS Fecha_Realizacion, Date()-[FR] AS [Dias desde Realizacion] FROM TbL_Plantilla INNER JOIN (SELECT  Tbl_Formacion.Curso, Max(Tbl_Formacion.Fecha_Realizacion) AS FR FROM Tbl_Formacion) AS B ON TbL_Plantilla.ID = B.ID WHERE (((TbL_Plantilla.ID)=1067) AND ((B.Curso)="Practicas MOTO") AND ((B.Fecha_Realizacion) Between #1/1/2016# And #5/20/2020#) ORDER BY TbL_Plantilla.ID, TbL_Plantilla.[Apellido 1], B.Fecha_Realizacion; 

Perdona, que la SQL me quedó incompleta:

SELECT TbL_Plantilla.ID, TbL_Plantilla.[Apellido 1], TbL_Plantilla.[Apellido 2], TbL_Plantilla.Nombre, 
B.Curso, B.FR AS Fecha_Realizacion, Date()-[FR] AS [Dias desde Realizacion] FROM TbL_Plantilla 
INNER JOIN (SELECT  Tbl_Formacion.Curso, Max(Tbl_Formacion.Fecha_Realizacion) AS FR FROM Tbl_Formacion 
GROUP BY Tbl_Formacion.Curso) AS B 
ON TbL_Plantilla.ID = B.ID WHERE (((TbL_Plantilla.ID)=1067) AND ((B.Curso)="Practicas MOTO") AND ((B.FR) Between #1/1/2016# And #5/20/2020#) ORDER BY TbL_Plantilla.ID, TbL_Plantilla.[Apellido 1], B.FR; 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas