SQL Server 하위 쿼리

Sep 25 2020

두 개의 SQL 쿼리를 결합하고 싶습니다. 첫 번째 쿼리는 최근 달의 직원 레코드를 풀백하고 두 번째 쿼리는 지난 3 개월 동안의 레코드를 풀백합니다.

광기에 대한 방법이 있습니다. 직원들은 매달 관리자를 변경할 수 있지만, 최근 달의 관리자는 해당 직원이 해당 달 동안 다른 관리자를 가졌더라도 해당 직원의 이전 3 개월 기록을 확인해야합니다.

이것은 최근 달에 가져올 첫 번째 선택입니다.

/******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])

이것은 지난 3 개월 동안 가져 오기위한 선택입니다.

/*********last 3 months*******************/
SELECT [REPORT_DT]
      ,[EMPLOYEE_ID]
      ,[EMPLOYEE_NAME]
      ,[LOCATION]
      ,[JOB_DESCRIPTION]
      ,[MANAGER_ID]
  FROM [EMPLOYEE]
  where [REPORT_DT]>=
  ( DATEADD(M, -3, GETDATE()))

저는 [EMPLOYEE_ID]에서 2 명의 선택에 합류 할 것입니다. 이 두 쿼리를 결합하는 방법에 대한 아이디어가 있습니까? 감사!

답변

1 GordonLinoff Sep 25 2020 at 17:45

두 테이블을 조인하려면 다음을 사용합니다.

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;

이 결과는 나에게 특별히 의미가 없다고 덧붙일 것입니다. 그러나 이것은 당신이 구체적으로 물은 질문입니다.

1 TimBiegeleisen Sep 25 2020 at 16:36

다음을 사용합니다.

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;

위의 WHERE절은 두 번째 쿼리와 일치 하며 테이블에서 TOP 1 WITH TIES최대 REPORT_DT값을 갖는 레코드를 가져 오는 방법을 사용 합니다.

1 MichałTurczyn Sep 25 2020 at 16:52

다음을 사용할 수도 있습니다 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())))

주석과 관련하여이 쿼리는 문제를 해결해야합니다.

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

최근 달의 [EMPLOYEE_ID] 명단을 받고 싶다고 생각했습니다. 그리고 그들의 3 개월 근로 기록을 얻으십시오. 현재 선택 스크립트에 따르면 (직원 목록을 제공하는지 여부에 관계없이 첫 번째 선택 스크립트를 이해하지 못했습니다) 이렇게 할 수 있습니다. 그러나 효과적인 해결책은 아닙니다. 조인 섹션에서 하위 선택을 추가 할 수도 있습니다. 먼저 이것을 시도하십시오.

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

아래 쿼리를 사용하여보기를 만든 다음이를 3 개월 날짜 프롬프트 (Business Objects 보고서에 사용됨)와 결합하여 트릭을 수행했습니다.

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)