Resultado em forma Horizontal

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
p43lo
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 26
Registrado em: Qua, 14 Jul 2010 11:35 am
Localização: vitoria es
T.I

Pessoal,
Como fazer como que o resultado abaixo saia com os nm_mnemonicos na mesma linha quando ds_tubo_coleta for o mesmo.

Resultado
nm_paciente - ds_tubo_coleta - cd_bancada - nm_mnemonico
GUINAR DA SILVA - TUBO T. VERMELHA 5 ML SORO - 7 CR
GUINAR DA SILVA - TUBO T. VERMELHA 5 ML SORO - 7 DHL
GUINAR DA SILVA - TUBO T. VERMELHA 5 ML SORO - 7 FAL
GUINAR DA SILVA - TUBO T. VERMELHA 5 ML SORO - 7 GGT
GUINAR DA SILVA - TUBO TAMPA ROXA - EDTA - 8 HG
GUINAR DA SILVA - TUBO TAMPA ROXA - EDTA - 8 PLA
GUINAR DA SILVA - TUBO T. VERMELHA 10 ML SORO - 16 B2MIC
GUINAR DA SILVA - TUBO T. VERMELHA 10 ML SORO - 16 CA125

Resultado Desejado

nm_paciente - ds_tubo_coleta - cd_bancada - nm_mnemonico
GUINAR DA SILVA - TUBO T. VERMELHA 5 ML SORO - 7 - CR, DHL, FAL,GGT

GUINAR DA SILVA - TUBO TAMPA ROXA - EDTA - 8 - HG,PLA

GUINAR DA SILVA - TUBO T. VERMELHA 10 ML SORO - 16 - B2MIC, CA125

Selecionar tudo

select 
 distinct
c.nm_paciente
,t.ds_tubo_coleta 
, e.cd_bancada
,X.nm_mnemonico
from 
ped_lab p, itped_lab i, set_exa s, tubo_coleta t, atendime a ,paciente c, exa_lab x, EXA_LAB_SET_EXA e, LEITO L,AMOSTRA_EXA_LAB r
where i.cd_ped_lab = p.cd_ped_lab 
and p.cd_ped_lab = 199839
and s.cd_set_exa (+)= i.cd_set_exa  
and i.cd_tubo_coleta = t.cd_tubo_coleta (+) 
and a.cd_atendimento = p.cd_atendimento (+) 
and c.cd_paciente = a.cd_paciente
and x.cd_exa_lab (+) = i.cd_exa_lab
and e.cd_exa_lab= x.cd_exa_lab 
AND E.cd_set_exa (+)= S.cd_set_exa
AND L.cd_leito (+) = A.cd_leito
and r.cd_itped_lab(+) = i.cd_itped_lab
order by  e.cd_bancada,X.nm_mnemonico

schnu
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 110
Registrado em: Ter, 24 Mai 2005 9:16 pm
Localização: Dongguan - Guangdong - China
Deus criou os loucos para confundir os sábios

Bom

Se você estiver usando um banco 11g com release 2 você pode fazer assim

SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;

Selecionar tudo

select 
distinct
c.nm_paciente
,t.ds_tubo_coleta 
, e.cd_bancada
,LISTAGG(X.nm_mnemonico, ',') WITHIN GROUP (ORDER BY ename)  AS LISTA_nm_mnemonico
from 
ped_lab p, itped_lab i, set_exa s, tubo_coleta t, atendime a ,paciente c, exa_lab x, EXA_LAB_SET_EXA e, LEITO L,AMOSTRA_EXA_LAB r
where i.cd_ped_lab = p.cd_ped_lab 
and p.cd_ped_lab = 199839
and s.cd_set_exa (+)= i.cd_set_exa  
and i.cd_tubo_coleta = t.cd_tubo_coleta (+) 
and a.cd_atendimento = p.cd_atendimento (+) 
and c.cd_paciente = a.cd_paciente
and x.cd_exa_lab (+) = i.cd_exa_lab
and e.cd_exa_lab= x.cd_exa_lab 
AND E.cd_set_exa (+)= S.cd_set_exa
AND L.cd_leito (+) = A.cd_leito
and r.cd_itped_lab(+) = i.cd_itped_lab
--
GROUP BY c.nm_paciente
,t.ds_tubo_coleta 
, e.cd_bancada
order by  e.cd_bancada,X.nm_mnemonico

Porém se não for essa a sua versão, dai você terá que criar alguns objetos no banco, veja mais informações em:
http://www.oracle-base.com/articles/mis ... hp#listagg


Eu particularmente criei os objetos que diz nessa página e funcionou perfeitamente para o meu caso !!!
Avatar do usuário
p43lo
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 26
Registrado em: Qua, 14 Jul 2010 11:35 am
Localização: vitoria es
T.I

Cara minha versao é 10.2.0.4.0 ..
Foi la ver o link. você não tem nenhum modelo parecido...
schnu
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 110
Registrado em: Ter, 24 Mai 2005 9:16 pm
Localização: Dongguan - Guangdong - China
Deus criou os loucos para confundir os sábios

Olha o que eu fiz foi executar esse código aqui

Selecionar tudo

CREATE OR REPLACE TYPE t_string_agg AS OBJECT
(
  g_string  VARCHAR2(32767),

  STATIC FUNCTION ODCIAggregateInitialize(sctx  IN OUT  t_string_agg)
    RETURN NUMBER,

  MEMBER FUNCTION ODCIAggregateIterate(self   IN OUT  t_string_agg,
                                       value  IN      VARCHAR2 )
     RETURN NUMBER,

  MEMBER FUNCTION ODCIAggregateTerminate(self         IN   t_string_agg,
                                         returnValue  OUT  VARCHAR2,
                                         flags        IN   NUMBER)
    RETURN NUMBER,

  MEMBER FUNCTION ODCIAggregateMerge(self  IN OUT  t_string_agg,
                                     ctx2  IN      t_string_agg)
    RETURN NUMBER
);
/
SHOW ERRORS


CREATE OR REPLACE TYPE BODY t_string_agg IS
  STATIC FUNCTION ODCIAggregateInitialize(sctx  IN OUT  t_string_agg)
    RETURN NUMBER IS
  BEGIN
    sctx := t_string_agg(NULL);
    RETURN ODCIConst.Success;
  END;

  MEMBER FUNCTION ODCIAggregateIterate(self   IN OUT  t_string_agg,
                                       value  IN      VARCHAR2 )
    RETURN NUMBER IS
  BEGIN
    SELF.g_string := self.g_string || ',' || value;
    RETURN ODCIConst.Success;
  END;

  MEMBER FUNCTION ODCIAggregateTerminate(self         IN   t_string_agg,
                                         returnValue  OUT  VARCHAR2,
                                         flags        IN   NUMBER)
    RETURN NUMBER IS
  BEGIN
    returnValue := RTRIM(LTRIM(SELF.g_string, ','), ',');
    RETURN ODCIConst.Success;
  END;

  MEMBER FUNCTION ODCIAggregateMerge(self  IN OUT  t_string_agg,
                                     ctx2  IN      t_string_agg)
    RETURN NUMBER IS
  BEGIN
    SELF.g_string := SELF.g_string || ',' || ctx2.g_string;
    RETURN ODCIConst.Success;
  END;
END;
/
SHOW ERRORS


CREATE OR REPLACE FUNCTION string_agg (p_input VARCHAR2)
RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING t_string_agg;
/
SHOW ERRORS

e dai é só executar esse teu select dessa forma:


Selecionar tudo

select 
distinct
c.nm_paciente
,t.ds_tubo_coleta 
, e.cd_bancada
,string_agg (X.nm_mnemonico)  nm_mnemonico
from 
ped_lab p, itped_lab i, set_exa s, tubo_coleta t, atendime a ,paciente c, exa_lab x, EXA_LAB_SET_EXA e, LEITO L,AMOSTRA_EXA_LAB r
where i.cd_ped_lab = p.cd_ped_lab 
and p.cd_ped_lab = 199839
and s.cd_set_exa (+)= i.cd_set_exa  
and i.cd_tubo_coleta = t.cd_tubo_coleta (+) 
and a.cd_atendimento = p.cd_atendimento (+) 
and c.cd_paciente = a.cd_paciente
and x.cd_exa_lab (+) = i.cd_exa_lab
and e.cd_exa_lab= x.cd_exa_lab 
AND E.cd_set_exa (+)= S.cd_set_exa
AND L.cd_leito (+) = A.cd_leito
and r.cd_itped_lab(+) = i.cd_itped_lab
group by c.nm_paciente
,t.ds_tubo_coleta 
, e.cd_bancada
order by  e.cd_bancada,X.nm_mnemonico
Avatar do usuário
p43lo
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 26
Registrado em: Qua, 14 Jul 2010 11:35 am
Localização: vitoria es
T.I

Vou analisar aqui.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes