Дополнительный запрос SQL Server

#sql #sql-server

Вопрос:

Я хочу объединить 2 SQL-запроса, первый запрос я хочу вернуть записи сотрудников за последний месяц, а второй запрос-вернуть записи за последние 3 месяца.

В этом безумии есть метод, сотрудники могут менять менеджера каждый месяц, но менеджер за последние месяцы должен видеть записи за предыдущие 3 месяца для своего сотрудника, даже если у этого сотрудника был другой менеджер за эти месяцы.

Это 1-й выбор, который нужно сделать за последний месяц

 /******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]gt;=  ( DATEADD(M, -3, GETDATE()))  

я бы присоединился к 2 выборам на [EMPLOYEE_ID]. Есть идеи, как я могу объединить эти 2 запроса? Спасибо!

Комментарии:

1. Как объединить? Вы можете И или ИЛИ условия пункта где.

2. Предположительно, последний месяц является одним из последних трех месяцев, поэтому второй запрос охватывает первый запрос.

Ответ №1:

Если вы хотите объединить две таблицы, вы бы использовали:

 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 gt;= dateadd(month, 3, getdate()) order by ecurr.employee_id, e.report_dt;  

Я добавлю, что этот результат не имеет для меня особого смысла. Но это вопрос, который вы специально задали.

Комментарии:

1. Это именно то, что мне было нужно, Гордон! Спасибо, большое спасибо!

2. У меня есть последующий вопрос по этому поводу. Если я хочу посмотреть на предыдущий месяц и извлечь из него последние 3 месяца, есть ли способ изменить запрос для этого? Таким образом, на данный момент последний report_dt-сентябрь, но если я выполню этот запрос при просмотре августовского report_dt, данные не вернутся, так как сентябрь-последний месяц.

Ответ №2:

Я бы использовал:

 SELECT TOP 1 WITH TIES  [REPORT_DT],  [EMPLOYEE_ID],  [EMPLOYEE_NAME],  [LOCATION],  [JOB_DESCRIPTION],  [MANAGER_ID], FROM [EMPLOYEE] WHERE  [REPORT_DT] gt;= DATEADD(M, -3, GETDATE() ORDER BY  [REPORT_DT] DESC;  

Приведенное выше WHERE предложение соответствует вашему второму запросу, и мы используем TOP 1 WITH TIES подход для получения записей, имеющих максимальные REPORT_DT значения в таблице.

Ответ №3:

Вы также можете использовать 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] gt;= (DATEADD(M, -3, GETDATE())))  

Что касается комментария, этот запрос должен решить проблему:

 SELECT [REPORT_DT]  ,[EMPLOYEE_ID]  ,[EMPLOYEE_NAME]  ,[LOCATION]  ,[JOB_DESCRIPTION]  ,[MANAGER_ID] FROM [EMPLOYEE] WHERE [REPORT_DT] gt;= (DATEADD(M, -3, GETDATE())) AND  EXISTS( SELECT 1 FROM [EMPLOYEE]  WHERE [EMPLOYEE_ID] == t.[EMPLOYEE_ID] AND  [REPORT_DT] gt;= (DATEADD(M, -1, GETDATE())))  

Комментарии:

1. Это возвращает данные за последний месяц, но я хотел получить представление данных за 3 месяца, чтобы менеджер за последний месяц мог просматривать любые данные своих сотрудников за последние 3 месяца. Может быть, я иду по этому неправильному пути

2. @Воздуходувки Попробуйте другой запрос 🙂

3. @Воздуходувки Не забудьте принять ответ, который решил вашу проблему.

Ответ №4:

Я думал, вы хотите получить список [EMPLOYEE_ID] за последний месяц. И получите их 3-месячную историю работы. В соответствии с вашими текущими сценариями выбора (я не понял ваш первый сценарий выбора, дает ли он список сотрудников или нет), вы можете сделать так. Но это не является эффективным решением. Вы также можете добавить дополнительный выбор в разделе присоединение. Сначала попробуйте это, пожалуйста.

 SELECT [REPORT_DT]  ,[EMPLOYEE_ID]  ,[EMPLOYEE_NAME]  ,[LOCATION]  ,[JOB_DESCRIPTION]  ,[MANAGER_ID]  FROM [EMPLOYEE]  where [REPORT_DT]gt;=(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]))  

Комментарии:

1. При попытке выполнить этот запрос я получаю следующую ошибку; В списке выбора может быть указано только одно выражение, если подзапрос не представлен с помощью EXISTS.

2. Затем попробуйте использовать exists; ВЫБЕРИТЕ [REPORT_DT] ,[ИДЕНТИФИКАТОР СОТРУДНИКА] ,[ИМЯ СОТРУДНИКА] ,[МЕСТОПОЛОЖЕНИЕ] ,[ОПИСАНИЕ РАБОТЫ] ,[ИДЕНТИФИКАТОР МЕНЕДЖЕРА] ИЗ [СОТРУДНИКА], ГДЕ [REPORT_DT] = (ВЫБЕРИТЕ MAX([REPORT_DT]) ИЗ [СОТРУДНИКА]) И СУЩЕСТВУЕТ( ВЫБЕРИТЕ [ИДЕНТИФИКАТОР СОТРУДНИКА] ИЗ [СОТРУДНИКА], ГДЕ [ИДЕНТИФИКАТОР СОТРУДНИКА] == t.[ИДЕНТИФИКАТОР СОТРУДНИКА] И [REPORT_DT] gt;= (DATEADD(M, -3, GETDATE ())))

Ответ №5:

Я создал представление, используя приведенный ниже запрос, а затем объединил его с запросом на дату за 3 месяца (он используется в отчете о бизнес-объектах), и это сработало.

 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)