Sql 在删除重复值的同时聚合一行中的证书名称

Sql 在删除重复值的同时聚合一行中的证书名称,sql,oracle,oracle12c,Sql,Oracle,Oracle12c,在下面的查询中,我使用了listag函数来聚合证书名称,即JPM\u DESCR90。但是,现在我正试图找到一种方法来删除行中的所有重复项,并减少all_uu\CERTIFICATIONS列中的值之间的空间。对于复制,我使用了distinct函数,即LISTAGG(distinct C.JPM_DESCR90,“,”)以及许多其他函数,但它们似乎都不起作用 SELECT A.EMPLID, A.JOBCODE, A.JOBCODE_DESCR, A.EMPL_STATUS, A.LOCATION

在下面的查询中,我使用了
listag
函数来聚合证书名称,即
JPM\u DESCR90
。但是,现在我正试图找到一种方法来删除行中的所有重复项,并减少
all_uu\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;
我得到了以下错误:

命令行中的错误:5列:27错误报告-SQL错误:ORA-00923:FROM关键字未找到预期的00923。00000-“在预期位置未找到来自关键字”*原因: *行动:


如果您对示例代码有任何建议或替代方法,我们将不胜感激。

这是否回答了您的问题?或者@MTO我在我的查询中尝试了这些变体,但运气不好。请建议此查询的语法变体

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;
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;