Apresentar no mesmo registro um campo com mais de um valor

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
tiagoof
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 11 Abr 2013 3:52 pm

Olá pessoal,

Preciso realizar uma consulta que me retorne todos os telefones e tipos cadastrados no mesmo registro, porém se tenho mais de um telefone cadastrado ele apresenta mais de uma linha de registro. Por exemplo, se tenho dois telefones cadastrados, um comercial e outro residencial, vai ser apresentado 2 registros da mesma pessoa, sendo que preciso apresentar a pessoa com os dois telefones no mesmo registro. Deve-se atentar também caso não exista nenhum telefone, pois o registro deve ser apresentado da mesma forma.

Os campos de tipo e telefone são respectivamente T.TEA_ST_TIPO, T.TEA_ST_TELEFONE.

Segue código

Selecionar tudo

SELECT    A.AGN_ST_NOME AGN_ST_NOME
          ,A.AGN_CH_TIPOPESSOAFJ AGN_CH_TIPOPESSOAFJ
          ,A.AGN_ST_EMAIL AGN_ST_EMAIL
          ,A.AGN_CH_TIPOINSCRICAO
          ,A.CNAE_ST_CODIGO
          ,A.AGN_ST_CGC
          ,A.AGN_IN_NATJURID
          ,A.AGN_CH_ENQUADRAMENTO
          ,A.AGN_ST_CEI
          ,A.AGN_ST_INSCRESTADUAL
          ,A.AGN_ST_INSCRMUNIC
          ,A.AGN_ST_URL
          ,A.PA_ST_SIGLA
          ,A.UF_ST_SIGLA
          ,A.AGN_ST_CEP
          ,A.MUN_IN_CODIGO
          ,A.TPL_ST_SIGLA
          ,A.AGN_ST_LOGRADOURO
          ,A.AGN_ST_NUMERO
          ,A.AGN_ST_COMPLEMENTO
          ,A.AGN_ST_REFERENCIA
          ,A.AGN_ST_BAIRRO
          ,A.AGN_ST_CEPCXPOSTAL
          ,A.AGN_ST_CXPOSTAL
          ,T.TEA_ST_TIPO
          ,T.TEA_ST_TELEFONE
FROM MGGLO.GLO_AGENTES A
    ,MGGLO.GLO_AGENTES_ID I
    ,MGGLO.GLO_CLIENTE C
    ,MGGLO.GLO_PESSOA_FISICA P
    ,MGGLO.GLO_TEL_AGENTES T
  WHERE I.AGN_TAU_ST_CODIGO = 'C'
                AND   I.AGN_TAB_IN_CODIGO = A.AGN_TAB_IN_CODIGO
                AND   I.AGN_PAD_IN_CODIGO = A.AGN_PAD_IN_CODIGO
                AND   I.AGN_IN_CODIGO     = A.AGN_IN_CODIGO
                AND   I.AGN_TAB_IN_CODIGO = C.AGN_TAB_IN_CODIGO (+)
                AND   I.AGN_PAD_IN_CODIGO = C.AGN_PAD_IN_CODIGO (+)
                AND   I.AGN_IN_CODIGO     = C.AGN_IN_CODIGO     (+)
                AND   I.AGN_TAU_ST_CODIGO = C.AGN_TAU_ST_CODIGO (+)
                AND   A.AGN_TAB_IN_CODIGO = P.AGN_TAB_IN_CODIGO (+)
                AND   A.AGN_PAD_IN_CODIGO = P.AGN_PAD_IN_CODIGO (+)
                AND   A.AGN_IN_CODIGO     = P.AGN_IN_CODIGO     (+)
                AND   P.AGN_CH_TIPO (+)   = 'P'
                AND   A.AGN_CH_TIPOPESSOAFJ = 'J'
                AND   T.AGN_TAB_IN_CODIGO = A.AGN_TAB_IN_CODIGO
                AND   T.AGN_PAD_IN_CODIGO = A.AGN_PAD_IN_CODIGO
                AND   T.AGN_IN_CODIGO     = A.AGN_IN_CODIGO
Alguém saberia me informar como realizo esta consulta?

Muito Obrigado.
Abs
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

tiagoof escreveu:Olá pessoal,

Preciso realizar uma consulta que me retorne todos os telefones e tipos cadastrados no mesmo registro, porém se tenho mais de um telefone cadastrado ele apresenta mais de uma linha de registro. Por exemplo, se tenho dois telefones cadastrados, um comercial e outro residencial, vai ser apresentado 2 registros da mesma pessoa, sendo que preciso apresentar a pessoa com os dois telefones no mesmo registro. Deve-se atentar também caso não exista nenhum telefone, pois o registro deve ser apresentado da mesma forma.

Os campos de tipo e telefone são respectivamente T.TEA_ST_TIPO, T.TEA_ST_TELEFONE.

Segue código

Selecionar tudo

SELECT    A.AGN_ST_NOME AGN_ST_NOME
          ,A.AGN_CH_TIPOPESSOAFJ AGN_CH_TIPOPESSOAFJ
          ,A.AGN_ST_EMAIL AGN_ST_EMAIL
          ,A.AGN_CH_TIPOINSCRICAO
          ,A.CNAE_ST_CODIGO
          ,A.AGN_ST_CGC
          ,A.AGN_IN_NATJURID
          ,A.AGN_CH_ENQUADRAMENTO
          ,A.AGN_ST_CEI
          ,A.AGN_ST_INSCRESTADUAL
          ,A.AGN_ST_INSCRMUNIC
          ,A.AGN_ST_URL
          ,A.PA_ST_SIGLA
          ,A.UF_ST_SIGLA
          ,A.AGN_ST_CEP
          ,A.MUN_IN_CODIGO
          ,A.TPL_ST_SIGLA
          ,A.AGN_ST_LOGRADOURO
          ,A.AGN_ST_NUMERO
          ,A.AGN_ST_COMPLEMENTO
          ,A.AGN_ST_REFERENCIA
          ,A.AGN_ST_BAIRRO
          ,A.AGN_ST_CEPCXPOSTAL
          ,A.AGN_ST_CXPOSTAL
          ,T.TEA_ST_TIPO
          ,T.TEA_ST_TELEFONE
FROM MGGLO.GLO_AGENTES A
    ,MGGLO.GLO_AGENTES_ID I
    ,MGGLO.GLO_CLIENTE C
    ,MGGLO.GLO_PESSOA_FISICA P
    ,MGGLO.GLO_TEL_AGENTES T
  WHERE I.AGN_TAU_ST_CODIGO = 'C'
                AND   I.AGN_TAB_IN_CODIGO = A.AGN_TAB_IN_CODIGO
                AND   I.AGN_PAD_IN_CODIGO = A.AGN_PAD_IN_CODIGO
                AND   I.AGN_IN_CODIGO     = A.AGN_IN_CODIGO
                AND   I.AGN_TAB_IN_CODIGO = C.AGN_TAB_IN_CODIGO (+)
                AND   I.AGN_PAD_IN_CODIGO = C.AGN_PAD_IN_CODIGO (+)
                AND   I.AGN_IN_CODIGO     = C.AGN_IN_CODIGO     (+)
                AND   I.AGN_TAU_ST_CODIGO = C.AGN_TAU_ST_CODIGO (+)
                AND   A.AGN_TAB_IN_CODIGO = P.AGN_TAB_IN_CODIGO (+)
                AND   A.AGN_PAD_IN_CODIGO = P.AGN_PAD_IN_CODIGO (+)
                AND   A.AGN_IN_CODIGO     = P.AGN_IN_CODIGO     (+)
                AND   P.AGN_CH_TIPO (+)   = 'P'
                AND   A.AGN_CH_TIPOPESSOAFJ = 'J'
                AND   T.AGN_TAB_IN_CODIGO = A.AGN_TAB_IN_CODIGO
                AND   T.AGN_PAD_IN_CODIGO = A.AGN_PAD_IN_CODIGO
                AND   T.AGN_IN_CODIGO     = A.AGN_IN_CODIGO
Alguém saberia me informar como realizo esta consulta?

Muito Obrigado.
Abs
você pode usar a função wm_concat juntamente com o group by. Essa função retorna em um único campo os valores que seriam exibidos em linhas.

No seu caso você informaria o campo telefone assim: wm_concat(T.TEA_ST_TELEFONE). Após isso basta fazer o group by pelos critérios que você precisar agrupar.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 318
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Caro companheiro.

Pelo o que estou entendendo você está trabalhando com atributos multivalorados, onde em uma mesma coluna você armazena uma estrutura de matriz para dados do mesmo tipo. Se for isso, existe uma forma peculiar de se trabalhar com estruturas que abordam este conceito. Também conhecido como Nested Tables, onde o tipo de dado e de domínio de outra tabela. Se não me engano, este recurso de Objeto-Relacional foi implementado a partir da versão 9 do Oracle. Vou tentar exemplificar abaixo:

Selecionar tudo


CREATE TYPE TELEFONES AS VARRAY AS VARRAY(5) OF VARCHAR(10) ;

CREATE TABLE CLIENTE(
CODIGO NUMBER(5),
NOME VARCHAR2(50)
TELEFONE TELEFONES -- O DATATYPE HERDA A ESTRUTURA CRIADA ANTERIORMENTE (ARRAY)
)

INSERT INTO CLIENTE VALUES(1,
                                              'JOSE',
                                              TELEFONES('9999999999',
                                                                '9999999999')
                                              );

SELECT * FROM CLIENTE;

Veja se isto lhe ajuda.

Qualquer coisa posta suas dúvidas.

Att.,
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

tiagoof ,

você pode fazer o que você quer através de PIVOT Tables ou através da função analítica LISTAGG (somente 11G). Eu prefiro a LISTAGG, pois ela é mais dinâmica! Eu demonstro nos treinamentos de SQL Tuning um exemplo parecido com o seu para fazer uma consulta em uma tabela de PEDIDOS e itens de pedidos, para mostrar todos os itens de um pedido na mesma linha.

[]S
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante