Менеджер запросов: Попытка ввести имя менеджера - PullRequest
0 голосов
/ 08 февраля 2019

Я использую Менеджер запросов PeopleSoft для создания нового отчета о найме, в котором указывается имя менеджера.К сожалению, таблица Job - EE фиксирует отчеты о позиции, а не менеджера.Чтобы получить имя менеджера, мне нужно снова связать таблицу Job - EE, связав две таблицы с A.Reports_To, равным G.Position_NBR.Итак, теперь у меня есть два представления таблицы Job - EE.Проблема в том, что я смотрю на диапазон дат (с 1 января 2018 года по настоящее время), и я не смог выяснить, как привлечь менеджера точно в то же время, что и дата найма.Кажется, я привожу всех менеджеров, которые были в положении «Reports_To» до окончания срока действия.Я думаю, это потому, что таблица Job - EE ссылается на должность (сообщает) вместо фактического сотрудника.Человек, занимающий отчеты, часто меняется.

У кого-нибудь есть предложения?
ИЗМЕНЕНО для обновления : Вот несколько фотографий различных таблиц, критериев менеджера запросов и т. Д .: Criteria Subquery Criteria Tables

Вот SQL :

    SELECT DISTINCT A.EMPLID, B.NAME, (CONVERT(CHAR(10),A.EFFDT,121)), A.DEPTID, D.DESCR, C.DESCR, A.ANNUAL_RT, E.DESCR, G.EMPLID, G.POSITION_NBR, Concat( H.FIRST_NAME,' ', H.LAST_NAME) 
  FROM PS_JOB A, PS_EMPLMT_SRCH_QRY A1, PS_PERSONAL_DATA B, PS_DEPT_TBL D, PS_SET_CNTRL_REC D2, PS_JOBCODE_TBL C, PS_SET_CNTRL_REC C2, PS_LOCATION_TBL E, PS_SET_CNTRL_REC E2, PS_JOB G, PS_EMPLMT_SRCH_QRY G1, PS_NAMES H, PS_PERALL_SEC_QRY H1 
  WHERE ( D.DEPTID = A.DEPTID 
    AND D2.SETCNTRLVALUE = A.BUSINESS_UNIT 
    AND D2.RECNAME = 'DEPT_TBL' 
    AND D2.SETID = D.SETID 
    AND C.JOBCODE = A.JOBCODE 
    AND C2.SETCNTRLVALUE = A.BUSINESS_UNIT 
    AND C2.RECNAME = 'JOBCODE_TBL' 
    AND C2.SETID = C.SETID 
    AND E.LOCATION = A.LOCATION 
    AND E2.SETCNTRLVALUE = A.BUSINESS_UNIT 
    AND E2.RECNAME = 'LOCATION_TBL' 
    AND E2.SETID = E.SETID 
    AND A.EMPLID = A1.EMPLID 
    AND A.EMPL_RCD = A1.EMPL_RCD 
    AND A1.OPRID = 'XXXXXXXX' 
    AND G.EMPLID = G1.EMPLID 
    AND G.EMPL_RCD = G1.EMPL_RCD 
    AND G1.OPRID = 'XXXXXXXX' 
    AND H.EMPLID = H1.EMPLID 
    AND H1.OPRID = 'XXXXXXXX' 
    AND ( A.EFFDT = (SELECT MIN( F.EFFDT) 
  FROM PS_JOB F, PS_EMPLMT_SRCH_QRY F1 
  WHERE F.EMPLID = F1.EMPLID 
    AND F.EMPL_RCD = F1.EMPL_RCD 
    AND F1.OPRID = 'XXXXXXXX' 
    AND ( A.EMPLID = F.EMPLID 
     AND A.EMPL_RCD = F.EMPL_RCD 
     AND A.ACTION IN ('HIR','REH','REI') 
     AND A.EFFDT BETWEEN :1 AND :2 )) 
     AND A.ACTION IN ('HIR','REH','REI') 
     AND B.EMPLID = A.EMPLID 
     AND D.EFFDT = 
        (SELECT MAX(D_ED.EFFDT) FROM PS_DEPT_TBL D_ED 
        WHERE D.SETID = D_ED.SETID 
          AND D.DEPTID = D_ED.DEPTID 
          AND D_ED.EFFDT <= A.EFFDT) 
     AND C.EFFDT = 
        (SELECT MAX(C_ED.EFFDT) FROM PS_JOBCODE_TBL C_ED 
        WHERE C.SETID = C_ED.SETID 
          AND C.JOBCODE = C_ED.JOBCODE 
          AND C_ED.EFFDT <= A.EFFDT) 
     AND E.EFFDT = 
        (SELECT MAX(E_ED.EFFDT) FROM PS_LOCATION_TBL E_ED 
        WHERE E.SETID = E_ED.SETID 
          AND E.LOCATION = E_ED.LOCATION 
          AND E_ED.EFFDT <= A.EFFDT) 
     AND A.REPORTS_TO = G.POSITION_NBR 
     AND G.EMPLID = H.EMPLID 
     AND H.EFFDT = 
        (SELECT MAX(H_ED.EFFDT) FROM PS_NAMES H_ED 
        WHERE H.EMPLID = H_ED.EMPLID 
          AND H.NAME_TYPE = H_ED.NAME_TYPE) 
     AND G.EFFDT = 
        (SELECT MAX(G_ED.EFFDT) FROM PS_JOB G_ED 
        WHERE G.EMPLID = G_ED.EMPLID 
          AND G.EMPL_RCD = G_ED.EMPL_RCD 
          AND G_ED.EFFDT <= ( A.LAST_HIRE_DT)+1) 
    AND G.EFFSEQ = 
        (SELECT MAX(G_ES.EFFSEQ) FROM PS_JOB G_ES 
        WHERE G.EMPLID = G_ES.EMPLID 
          AND G.EMPL_RCD = G_ES.EMPL_RCD 
          AND G.EFFDT = G_ES.EFFDT) ))

1 Ответ

0 голосов
/ 13 февраля 2019

В дополнение к тому, что это намного проще, если ваше учреждение / компания просто использует поле SUPERVISOR_ID, похоже, ваша проблема заключается в следующем:

Кажется, я привожу всех менеджеров, которые былив позиции Reports_To до конечной даты вступления в силу

Это связано с тем, что при первоначальном выборе PS_JOB (A) вы ограничиваете дату вступления в силу (EFFDT) только вашим диапазоном ввода [: 1,: 2] для записей с действием в ('HIR', 'REH', 'REI').

 AND ( A.EFFDT BETWEEN :1 AND :2  
 AND A.ACTION IN ('HIR','REH','REI')
 ... )

Это выберет каждую запись с EFFDT в интервале, в то время как вы хотите только одну,предположительно, первый (MIN).

AND ( A.EFFDT = (SELECT MIN(A_ED.EFFDT) FROM PS_JOB A_ED
                    WHERE A_ED.EMPLID = A.EMPLID
                      AND A_ED.EMPL_RCD = A.EMPL_RCD
                      AND A.ED.EFFDT BETWEEN :1 AND :2
                      AND A_ED.ACTION IN ('HIR', 'REH', 'REI')
... ) 

Вероятно, это решит проблему, но имейте в виду, что вам также может понадобиться учесть эффективную последовательность (EFFSEQ) для фильтрации одной записи.

РЕДАКТИРОВАТЬ: с помощью диспетчера запросов

  1. Перейти к критериям и отредактировать критерий A.EFFDT.
  2. Тип условия должен быть «равен», а тип выражения 2 должен быть подзапросом.
  3. Определение / редактирование подзапроса
  4. Выберите Job EE в качестве записи, нажмите OK в окне сообщения о дате вступления в силу.
  5. Выберите EFFDT в качестве поля на вкладке "Запрос", поле "Изменить" и выберите Мин. Агрегат.Здесь вы получите сообщение об ошибке «агрегатное поле, но оно используется в критериях отсутствия»
  6. Перейдите на вкладку «Критерии», удалите автоматически добавленный критерий effdt и добавьте другие критерии, соответствующие подзапросу для основного запроса, икритерии действия. 1

Subquery criteria

...