Подзапрос SQL Server
Я хочу объединить 2 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 запроса? Спасибо!
Ответы
Если вы хотите объединить две таблицы, вы должны использовать:
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;
Добавлю, что этот результат не имеет для меня особого смысла. Но это вопрос, который вы конкретно задали.
Я хотел бы использовать:
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значения в таблице.
Вы также можете использовать 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())))
Я думал, вы хотите получить список [EMPLOYEE_ID] за последний месяц. И получите их трехмесячный стаж работы. В соответствии с вашими текущими сценариями выбора (я не понял ваш первый сценарий выбора, дает ли он список сотрудников или нет) вы можете сделать это так. Но это не эффективное решение. Вы также можете добавить подвыбор в раздел присоединения. Сначала попробуйте это, пожалуйста.
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]))
Я создал представление, используя приведенный ниже запрос, а затем объединил его с трехмесячным указанием даты (это используется в отчете 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)