Subconsulta do SQL Server

Sep 25 2020

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

1 GordonLinoff Sep 25 2020 at 17:45

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.

1 TimBiegeleisen Sep 25 2020 at 16:36

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.

1 MichałTurczyn Sep 25 2020 at 16:52

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())))
ORCAs Sep 25 2020 at 16:44

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]))
Blowers Oct 16 2020 at 15:46

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)