LISTAGG function returning repeated values

Asked

Viewed 517 times

0

I have a multi-valued field where I need the result to return in one line, trying to use LISTAGG, but it returns one value per line and each value repeated 5 x.

Any idea ?

I’ll paste the code so it’s clear.

SELECT   DISTINCT

A.ID ID_PROJETO,

A.CODE Codigo_projeto,

A.NAME NOME_PROJETO,

A.DESCRIPTION DESCRICAO,

B.BR_TECNOLOGIA TECNOLOGIA,

B.BR_NOME_GER_EXECUTO GERENCIA_EXECUTORA,

A.PRIORITY PRIORIDADE,

A.STATUS STATUS,

D.NAME STATUS_NAME,

E.PERCENT_COMPLETE * 100 PERCENT_COMPLET,

F.UNIQUE_NAME CHAVE_GERENTE,

F.FULL_NAME NOME_GERENTE,

G.FULL_NAME NOME_USUARIO_CRIADOR,

G.UNIQUE_NAME CHAVE_USUARIO_CRIADOR,

A.SCHEDULE_START DATA_DE_INICIO,

A.SCHEDULE_FINISH PREVISAO_DE_CONCLUSAO,

A.CREATED_DATE DATA_CRIACAO_PROJETO,

B.br_situacao_projeto SITUACAO_PROJETO,

B.br_dt_conclusao DATA_CONCLUSAO,

B.br_flag_rac ACOMPANHAMENTO_PRESIDENCIA,

B.br_id_sol_yscsol SOLICITACAO_DE_ORIGEM,

B.obj_objective OBJETIVO,

to_char(B.br_justificativa) JUSTIFICATIVA,

to_char(B.br_expectativas) EXPECTATIVAS,

B.br_nome_ger_executo GERENCIA_EXECUTORA,

F.full_name GERENTE_DESTINO,

G.full_name LIDER_PROJETO,

**LISTAGG(r.full_name, ';') WITHIN GROUP (ORDER BY r.full_name desc)  
PMO_DA_AREA_EXECUTORA,** 

B.br_nome_diretoria DIRETORIA_CLIENTE,

OU.name GERENCIA_CLIENTE,

B.br_nome_cliente NOME_CLIENTE,

B.br_chave_cliente CHAVE_CLIENTE,

B.br_tap TAP,

B.br_tep TEP,

--t.prname TAREFA,



CASE   



  WHEN B.br_ante_projeto  = 1 THEN 'ANTEPROJETO'

           WHEN B.BR_ANTE_PROJETO  = 0 THEN 'PROJETO'

           END PROJETO



FROM INV_INVESTMENTS A

LEFT JOIN ODF_CA_PROJECT B ON (A.ID = B.ID)

LEFT JOIN CMN_LOOKUPS_V D ON (A.STATUS = D.LOOKUP_ENUM)

     AND d.lookup_type = 'INVESTMENT_OBJ_STATUS' AND d.language_code = 'pt'

LEFT JOIN INV_PROJECTS E ON (A.ID = E.PRID)

LEFT JOIN SRM_RESOURCES F ON (A.MANAGER_ID = F.USER_ID)

LEFT OUTER JOIN SRM_RESOURCES G ON (G.USER_ID = A.CREATED_BY)

join prj_obs_units OU on B.br_depto_cliente = OU.id and OU.type_id = 5000019

join  prtask t  on A.id = t.prprojectid

**left join ODF_MULTI_VALUED_LOOKUPS d on d.pk_id=A.id and d.attribute = 
'pbk_prj_rvwrs' and d.object ='project'

join srm_resources r on r.id = d.value**



where A.id = 5140794



group by 

A.ID ,

A.CODE ,

A.NAME ,

A.DESCRIPTION ,

B.BR_TECNOLOGIA,

B.BR_NOME_GER_EXECUTO ,

A.PRIORITY ,

A.STATUS ,

D.NAME ,

E.PERCENT_COMPLETE * 100 ,

F.UNIQUE_NAME ,

F.FULL_NAME ,

G.FULL_NAME ,

G.UNIQUE_NAME ,

A.SCHEDULE_START ,

A.SCHEDULE_FINISH ,

A.CREATED_DATE ,

B.br_situacao_projeto ,

B.br_dt_conclusao ,

OU.name ,

to_char(B.br_expectativas) ,

B.br_nome_diretoria ,

B.br_flag_rac,

B.br_id_sol_yscsol ,

B.br_nome_ger_executo,

B.br_nome_cliente ,

B.br_chave_cliente ,

B.obj_objective ,

to_char(B.br_justificativa) ,

F.full_name,

G.full_name,

A.target_manager_id ,

A.manager_id , 

B.br_tap ,

B.br_tep ,

--t.prname ,
B.br_ante_projeto,

r.full_name

2 answers

1

The behavior is the same , follows an example :

SELECT CLIENTE, 
       CAST (LISTAGG(PRODUTO, ';') WITHIN GROUP (ORDER BY PRODUTO desc) AS VARCHAR2(30)) PRODS
       --CAST SÓ PARA O SQL PLUS
FROM
(
SELECT 'A' CLIENTE,'123' PRODUTO FROM DUAL
UNION ALL
SELECT 'A' CLIENTE,'123' PRODUTO FROM DUAL
UNION ALL
SELECT 'A' CLIENTE,'234' PRODUTO FROM DUAL
UNION ALL
SELECT 'A' CLIENTE,'345' PRODUTO FROM DUAL
UNION ALL
SELECT 'B' CLIENTE,'123' PRODUTO FROM DUAL
UNION ALL
SELECT 'B' CLIENTE,'234' PRODUTO FROM DUAL
UNION ALL
SELECT 'C' CLIENTE,'123' PRODUTO FROM DUAL
)
GROUP BY CLIENTE


CLIENTE PRODS                        
------- ------------------------------
A       345;234;123;123                
B       234;123                        
C       123  



SELECT CLIENTE, 
       CAST (LISTAGG(PRODUTO, ';') WITHIN GROUP (ORDER BY PRODUTO desc) AS VARCHAR2(30)) PRODS
       --CAST SÓ PARA O SQL PLUS
FROM
(
SELECT DISTINCT CLIENTE,PRODUTO
FROM
  (
  SELECT 'A' CLIENTE,'123' PRODUTO FROM DUAL
  UNION ALL
  SELECT 'A' CLIENTE,'123' PRODUTO FROM DUAL
  UNION ALL
  SELECT 'A' CLIENTE,'234' PRODUTO FROM DUAL
  UNION ALL
  SELECT 'A' CLIENTE,'345' PRODUTO FROM DUAL
  UNION ALL
  SELECT 'B' CLIENTE,'123' PRODUTO FROM DUAL
  UNION ALL
  SELECT 'B' CLIENTE,'234' PRODUTO FROM DUAL
  UNION ALL
  SELECT 'C' CLIENTE,'123' PRODUTO FROM DUAL
  )
)
GROUP BY CLIENTE

CLIENTE PRODS                        
------- ------------------------------
A       345;234;123                    
B       234;123                        
C       123   

Handles duplicity in source SQL

  • I get it. I’m an intern and a lot of things are still confusing. Is there no way to put them in this format? I mean, the results in a single line?

  • Do the distinct before and listagg after as in the example

  • I’m not getting it, that’s it?

0

That’s about all?

I’m not getting it, that’s it?

SELECT

A.ID ID_PROJETO,

A.CODE Code_project,

A.NAME NOME_PROJETO,

A.DESCRIPTION DESCRIPTION,

B.BR_TECNOLOGIA TECHNOLOGY,

B.BR_NOME_GER_EXECUTO GERENCIA_EXECUTORA,

A.PRIORITY PRIORITY,

A.STATUS STATUS,

D.NAME STATUS_NAME,

E.PERCENT_COMPLETE * 100 PERCENT_COMPLET,

F.UNIQUE_NAME CHAVE_GERENTE,

F.FULL_NAME NOME_GERENTE,

G.FULL_NAME NOME_USUARIO_CRIADOR,

G.UNIQUE_NAME CHAVE_USUARIO_CRIADOR,

A.SCHEDULE_START DATA_DE_INICIO,

A.SCHEDULE_FINISH PREVISAO_DE_CONCLUSAO,

A.CREATED_DATE DATA_CRIACAO_PROJETO,

B.br_situacao_projeto SITUACAO_PROJETO,

B.br_dt_conclusao DATA_CONCLUSAO,

B.br_flag_rac ACOMPANHAMENTO_PRESIDENCIA,

B.br_id_sol_yscsol SOLICITACAO_DE_ORIGEM,

B.obj_objective OBJECTIVE,

to_char(B.br_justification) JUSTIFICATION,

to_char(B.br_expectations) EXPECTATIONS,

B.br_nome_ger_executo GERENCIA_EXECUTORA,

F.full_name GERENTE_DESTINO,

G.full_name LIDER_PROJETO,

LISTAGG(r. full_name, ';') WITHIN GROUP (ORDER BY r.full_name desc)

PMO_DA_AREA_EXECUTORA,

B.br_nome_diretoria DIRETORIA_CLIENTE,

OR.name GERENCIA_CLIENTE,

B.br_name NOME_CLIENTE client,

B.br_chave_cliente CHAVE_CLIENTE,

B.br_tap TAP,

B.br_tep TEP,

--t. prname TASK,

CASE

WHEN B.br_ante_project = 1 THEN 'PRELIMINARY PROJECT'

       WHEN B.BR_ANTE_PROJETO  = 0 THEN 'PROJETO'

       END PROJETO

FROM

(

SELECT DISTINCT r.full_name

FROM

(

    INV_INVESTMENTS A

    LEFT JOIN ODF_CA_PROJECT B ON (A.ID = B.ID)

    LEFT JOIN CMN_LOOKUPS_V D ON (A.STATUS = D.LOOKUP_ENUM)

         AND d.lookup_type = 'INVESTMENT_OBJ_STATUS' AND d.language_code = 

'pt'

    LEFT JOIN INV_PROJECTS E ON (A.ID = E.PRID)

    LEFT JOIN SRM_RESOURCES F ON (A.MANAGER_ID = F.USER_ID)

    LEFT OUTER JOIN SRM_RESOURCES G ON (G.USER_ID = A.CREATED_BY)

    join prj_obs_units OU on B.br_depto_cliente = OU.id and OU.type_id = 

5000019

    join  prtask t  on A.id = t.prprojectid

    left join ODF_MULTI_VALUED_LOOKUPS d on (d.pk_id=A.id and d.attribute) = 

'pbk_prj_rvwrs' and d.Object ='project'

    join srm_resources r on r.id = d.value



    where A.id = 5140794

  )

)

group by

A.ID ,

A.CODE ,

A.NAME ,

A.DESCRIPTION ,

B.BR_TECNOLOGIA,

B.BR_NOME_GER_EXECUTO ,

A.PRIORITY ,

A.STATUS ,

D.NAME ,

E.PERCENT_COMPLETE * 100 ,

F.UNIQUE_NAME ,

F.FULL_NAME ,

G.FULL_NAME ,

G.UNIQUE_NAME ,

A.SCHEDULE_START ,

A.SCHEDULE_FINISH ,

A.CREATED_DATE , B.br_situacao_project ,

B.br_dt_conclusion ,

OR name. ,

to_char(B.br_expectations) ,

B.br_directorial name ,

B.br_flag_rac,

B.br_id_sol_yscsol ,

B.br_execution_name,

B.br_client name ,

B.br_key_client ,

B.obj_objective ,

to_char(B.br_justification) ,

F.full_name,

G.full_name,

A.target_manager_id ,

A.manager_id ,

B.br_tap ,

B.br_tep ,

--t. prname ,

B.br_preview project,

r. full_name

Browser other questions tagged

You are not signed in. Login or sign up in order to post.