Subconsulta de SQL Server
Quiero combinar 2 consultas SQL, la primera consulta quiero extraer los registros de empleados del último mes y la segunda consulta, extraer los registros de los últimos 3 meses.
Existe un método para la locura, los empleados pueden cambiar de gerente cada mes, pero el gerente de los últimos meses necesita ver los registros de los 3 meses anteriores de su empleado, incluso si ese empleado tenía un gerente diferente para esos meses.
Esta es la primera selección para obtener el último mes
/******latest month*****************/
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]=
(select max([REPORT_DT]) from [EMPLOYEE])
esta es la selección para tirar en los últimos 3 meses
/*********last 3 months*******************/
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]>=
( DATEADD(M, -3, GETDATE()))
Me uniría a las 2 selecciones en [EMPLOYEE_ID]. ¿Alguna idea de cómo puedo combinar estas 2 consultas? ¡Gracias!
Respuestas
Si desea unir las dos tablas, usaría:
select ecurr.*, e.* -- or whatever columns you like
from employee ecurr join
employee e
on ecurr.employee_id = e.employee_id
where ecurr.report_dt = (select max(e2.report_dt) from employee e2) and
e.report_dt >= dateadd(month, 3, getdate())
order by ecurr.employee_id, e.report_dt;
Agregaré que este resultado no tiene un sentido particular para mí. Pero esta es la pregunta que hiciste específicamente.
Yo usaría:
SELECT TOP 1 WITH TIES
[REPORT_DT],
[EMPLOYEE_ID],
[EMPLOYEE_NAME],
[LOCATION],
[JOB_DESCRIPTION],
[MANAGER_ID],
FROM [EMPLOYEE]
WHERE
[REPORT_DT] >= DATEADD(M, -3, GETDATE()
ORDER BY
[REPORT_DT] DESC;
La WHEREcláusula anterior coincide con su segunda consulta y utilizamos un TOP 1 WITH TIESenfoque para obtener los registros que tienen los REPORT_DTvalores máximos en la tabla.
También puede utilizar EXISTS:
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
WHERE [REPORT_DT] = (SELECT MAX([REPORT_DT]) FROM [EMPLOYEE]) AND
EXISTS( SELECT 1 FROM [EMPLOYEE]
WHERE [EMPLOYEE_ID] == t.[EMPLOYEE_ID] AND
[REPORT_DT] >= (DATEADD(M, -3, GETDATE())))
En cuanto al comentario, esta consulta debería solucionar el problema:
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
WHERE [REPORT_DT] >= (DATEADD(M, -3, GETDATE())) AND
EXISTS( SELECT 1 FROM [EMPLOYEE]
WHERE [EMPLOYEE_ID] == t.[EMPLOYEE_ID] AND
[REPORT_DT] >= (DATEADD(M, -1, GETDATE())))
Pensé que querías obtener la lista [EMPLOYEE_ID] del último mes. Y obtenga su historial laboral de 3 meses. De acuerdo con sus scripts de selección actuales (no entendí su primer script de selección si da una lista de empleados o no) puede hacer esto. Pero no es una solución eficaz. También puede agregar una sub selección en la sección de unión. Primero intente esto por favor.
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]>=(DATEADD(M, -3, GETDATE()))
AND [EMPLOYEE_ID] IN (SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]=
(select max([REPORT_DT]) from [EMPLOYEE]))
Creé una Vista usando la consulta a continuación, y luego combiné esto con una solicitud de fecha de 3 meses (esto se está usando en un informe de Business Objects) y eso funcionó.
SELECT
b.[MANAGER_ID],
a.[EMPLOYEE_ID],
a.[START_DT],
a.[EMPLOYEE_NAME],
a.[LOCATION],
a.[JOB_DESCRIPTION],
a.[REPORT_DT]
FROM [EMPLOYEE] b INNER JOIN
[EMPLOYEE] a
ON b.[EMPLOYEE_ID] = a.[EMPLOYEE_ID]
WHERE b.[REPORT_DT] = (SELECT MAX(c.[REPORT_DT])
FROM [EMPLOYEE] c)