Subconsulta do SQL Server
Quero combinar 2 consultas SQL, a primeira consulta quero recuperar registros de funcionários do último mês e a segunda consulta recuperar registros dos últimos 3 meses.
Existe um método para a loucura, os funcionários podem mudar de gerente a cada mês, mas o gerente dos últimos meses precisa ver os registros dos 3 meses anteriores de seu funcionário, mesmo que esse funcionário tenha um gerente diferente nesses meses.
Esta é a primeira seleção para puxar no último mês
/******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 é a seleção para puxar nos ú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()))
Eu estaria me juntando aos 2 selects em [EMPLOYEE_ID]. Alguma ideia de como posso combinar essas 2 querys? Obrigado!
Respostas
Se você quiser juntar as duas tabelas, você deve usar:
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;
Acrescentarei que este resultado não faz muito sentido para mim. Mas esta é a pergunta que você fez especificamente.
Eu usaria:
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;
A WHEREcláusula acima corresponde à sua segunda consulta e usamos uma TOP 1 WITH TIESabordagem para obter os registros com os REPORT_DTvalores máximos na tabela.
Você também pode usar 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())))
Em relação ao comentário, esta consulta deve resolver o 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())))
Achei que você deseja obter a lista de [EMPLOYEE_ID] do último mês. E obtenha seu histórico de trabalho de 3 meses. De acordo com seus scripts de seleção atuais (não entendi seu primeiro script de seleção se ele fornece uma lista de funcionários ou não), você pode fazer assim. Mas não é uma solução eficaz. Você também pode adicionar sub-seleção na seção de junção. Primeiro tente isso, 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]))
Eu criei uma visualização usando a consulta abaixo e, em seguida, combinei isso com um prompt de data de 3 meses (isso está sendo usado em um relatório do Business Objects) e isso funcionou.
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)