Объединение имен сертификатов в одну строку при удалении повторяющихся значений - PullRequest
0 голосов
/ 16 января 2020

В приведенном ниже запросе я использовал функцию LISTAGG для агрегирования имен сертификатов, т.е. JPM_DESCR90. Однако сейчас я пытаюсь найти способ удалить все дубликаты в строке и уменьшить расстояние между значениями в столбце All_ CERTIFICATIONS. Для дублирования я использовал функцию distinct, то есть LISTAGG( DISTINCT C.JPM_DESCR90,','), а также ряд других функций, но ни одна из них, похоже, не работает.

SELECT A.EMPLID, A.JOBCODE, A.JOBCODE_DESCR, A.EMPL_STATUS, A.LOCATION, A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID, MAX( TO_CHAR(C.JPM_DATE_3,'YYYY-MM-DD')) AS Latest_Certification_Date ,LISTAGG( C.JPM_DESCR90,',') WITHIN GROUP ( ORDER BY C.JPM_DESCR90) AS All_Certifications 
  FROM    PS_NPS_VIEW_ALL A, (PS_PERSON_NAME B LEFT OUTER JOIN  PS_NPS_LIC_VW_RPT C ON  B.EMPLID = C.EMPLID ), PSOPRDEFN E
  WHERE ( A.EFFDT =
        (SELECT MAX(A_ED.EFFDT) FROM PS_NPS_VIEW_ALL A_ED
        WHERE A.EMPLID = A_ED.EMPLID
          AND A.EMPL_RCD = A_ED.EMPL_RCD
          AND A_ED.EFFDT <= SYSDATE)
    AND A.EFFSEQ =
        (SELECT MAX(A_ES.EFFSEQ) FROM PS_NPS_VIEW_ALL A_ES
        WHERE A.EMPLID = A_ES.EMPLID
          AND A.EMPL_RCD = A_ES.EMPL_RCD
          AND A.EFFDT = A_ES.EFFDT)
     AND A.EMPLID = B.EMPLID
     AND A.EMPLID = E.EMPLID
     AND A.PER_ORG = 'EMP'
     AND A.EMPL_STATUS='A'
     AND A.PAYGROUP NOT IN ('SUM','CWR'))
  GROUP BY A.EMPLID, A.JOBCODE,A.JOBCODE_DESCR, A.EMPL_STATUS, A.LOCATION, A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID;

Отдельная функция не будет работать, потому что я использовал Oracle 12 c.

Еще одна вещь, которую я попытался, - использовать вложенный оператор выбора.


SELECT A.EMPLID, A.JOBCODE,A.JOBCODE_DESCR, A.EMPL_STATUS, A.LOCATION, A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID,
LISTAGG(C.JPM_DESCR90,','on overflow truncate with count) WITHIN GROUP ( ORDER BY C.JPM_DESCR90)  from (select unique JPM_DESCR90 JPM_DESCR90   
                  from PS_NPS_LIC_VW_RPT C  
                 where A.EMPLID = F.EMPLID)) JPM
  FROM PS_NPS_VIEW_ALL A, (PS_PERSON_NAME B LEFT OUTER JOIN  PS_NPS_LIC_VW_RPT C ON  B.EMPLID = C.EMPLID ), PSOPRDEFN E
  WHERE ( A.EFFDT =
        (SELECT MAX(A_ED.EFFDT) FROM PS_NPS_VIEW_ALL A_ED
        WHERE A.EMPLID = A_ED.EMPLID
          AND A.EMPL_RCD = A_ED.EMPL_RCD
          AND A_ED.EFFDT <= SYSDATE)
    AND A.EFFSEQ =
        (SELECT MAX(A_ES.EFFSEQ) FROM PS_NPS_VIEW_ALL A_ES
        WHERE A.EMPLID = A_ES.EMPLID
          AND A.EMPL_RCD = A_ES.EMPL_RCD
          AND A.EFFDT = A_ES.EFFDT)
     AND A.EMPLID = B.EMPLID
     AND A.EMPLID = E.EMPLID
     AND A.PER_ORG = 'EMP'
     AND A.EMPL_STATUS='A'
     AND A.PAYGROUP NOT IN ('SUM','CWR'))
  GROUP BY A.EMPLID, A.JOBCODE,A.JOBCODE_DESCR, A.EMPL_STATUS, A.LOCATION, A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID;

Приведенный выше синтаксис дает следующую ошибку

Ошибка в командной строке: 3 Колонка: 44 Отчет об ошибке - SQL Ошибка: ORA-00933: SQL команда не завершена должным образом 00933 . 00000 - «SQL команда не завершена должным образом» * Причина: * Действие:

Затем я попытался regex_replace удалить дубликаты.

SELECT  A.EMPLID,
RTRIM(REGEXP_REPLACE(
           (listagg(Num2,'-') WITHIN GROUP (ORDER BY C.JPM_DESCR90) OVER() ), 
           '([^-]*)(-\1)+($|-)', 
           '\1\3'), '-') C.JPM_DESCR90 ,A.JOBCODE,A.JOBCODE_DESCR, A.EMPL_STATUS, A.LOCATION, A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID
  FROM PS_NPS_VIEW_ALL A, (PS_PERSON_NAME B LEFT OUTER JOIN  PS_NPS_LIC_VW_RPT C ON  B.EMPLID = C.EMPLID ), PSOPRDEFN E
  WHERE ( A.EFFDT =
        (SELECT MAX(A_ED.EFFDT) FROM PS_NPS_VIEW_ALL A_ED
        WHERE A.EMPLID = A_ED.EMPLID
          AND A.EMPL_RCD = A_ED.EMPL_RCD
          AND A_ED.EFFDT <= SYSDATE)
    AND A.EFFSEQ =
        (SELECT MAX(A_ES.EFFSEQ) FROM PS_NPS_VIEW_ALL A_ES
        WHERE A.EMPLID = A_ES.EMPLID
          AND A.EMPL_RCD = A_ES.EMPL_RCD
          AND A.EFFDT = A_ES.EFFDT)
     AND A.EMPLID = B.EMPLID
     AND A.EMPLID = E.EMPLID
     AND A.PER_ORG = 'EMP'
     AND A.EMPL_STATUS='A'
     AND A.PAYGROUP NOT IN ('SUM','CWR'))
  GROUP BY  A.EMPLID, CERT, A.JOBCODE,A.JOBCODE_DESCR, A.EMPL_STATUS, A.LOCATION, A.LOCATION_DESCR, A.NAME, E.EMAILID, B.EMPLID, E.OPRID;

И я получил следующая ошибка:

Ошибка в командной строке: 5 Столбец: 27 Отчет об ошибке - SQL Ошибка: ORA-00923: ключевое слово FROM не найдено там, где ожидается 00923. 00000 - Ключевое слово FROM не найдено там, где ожидается "* Причина: * Действие:

Будем благодарны за любые предложения или альтернативные подходы с примером кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...