Ir para conteúdo
Fórum Script Brasil
  • 0

Consulta no postgresql


Andre P. Vieira

Pergunta

Bom dia a todos,

Sou novo no forum e ainda mais no mundo de desenvolvimento, estou com um pequeno problema que é na realização de uma consulta no banco.

Ao realizar uma consulta o banco me traz varias informações de um mesmo produto, preciso unir todas informações deste mesmo produto em uma unica linha exemplo.

Consulta:

SELECT doacao.codigo as doacao, doador.codigo as doador, doador.nome, doador.sexo, doador.tipo_sanguineo as ABO, doador.rh, doacao.data,

(select descricao from antigeno where codigo=doacaofenotipo.antigeno) as antigeno, doacaofenotipo.resultado

FROM doacao, doacaofenotipo, doador

WHERE doacaofenotipo.doacao=doacao.codigo and doador=doador.codigo

and doacao.data >= '2012-05-01' and doacao.data <= '2012-05-10'

"4321";"120372";"Zézinho ";"M";"O ";"+";"2012-05-02";"D ( sistema Rh )";"+"

"4321";"120372";"Zézinho ";"M";"O ";"+";"2012-05-02";"C ( sistema Rh )";"+"

"4321";"120372";"Zézinho ";"M";"O ";"+";"2012-05-02";"E ( sistema Rh )";"-"

"4321";"120372";"Zézinho ";"M";"O ";"+";"2012-05-02";"c ( sistema Rh )";"+"

"4321";"120372";"Zézinho ";"M";"O ";"+";"2012-05-02";"e ( sistema Rh )";"+"

"4321";"120372";"Zézinho ";"M";"O ";"+";"2012-05-02";"K ( sistema Kell )";"-"

As informações que estão em negrito quero que fique em apenas uma linha, para este mesmo cliente que é "Zézinho"

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Se for postgresql 9.0+ você pode usar a função string_agg.

SELECT 
    doacao.codigo as doacao, 
    doador.codigo as doador, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo as ABO, 
    doador.rh, 
    doacao.data,
    string_agg(
        (select descricao from antigeno where codigo=doacaofenotipo.antigeno)
        || ' ' ||
        doacaofenotipo.resultado
        , ';') as antigeno_resultado
FROM doacao, doacaofenotipo, doador
WHERE 
    doacaofenotipo.doacao = doacao.codigo 
    and doador = doador.codigo
    and doacao.data >= '2012-05-01' 
    and doacao.data <= '2012-05-10'
group by
    doacao.codigo, 
    doador.codigo, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo, 
    doador.rh, 
    doacao.data

Editado por Kakao
Link para o comentário
Compartilhar em outros sites

  • 0

Eu utilizo aqui o 8.3 rodei o que me passou apresentou a seguinte mensagem:

ERROR: function string_agg(text, unknown) does not exist

LINE 9: string_agg(

^

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

********** Error **********

ERROR: function string_agg(text, unknown) does not exist

SQL state: 42883

Hint: No function matches the given name and argument types. You might need to add explicit type casts.

Character: 177

Desde já obrigado pelo retorno.

=========================================================

Se for postgresql 9.0+ você pode usar a função string_agg.

SELECT 
    doacao.codigo as doacao, 
    doador.codigo as doador, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo as ABO, 
    doador.rh, 
    doacao.data,
    string_agg(
        (select descricao from antigeno where codigo=doacaofenotipo.antigeno)
        || ' ' ||
        doacaofenotipo.resultado
        , ';') as antigeno_resultado
FROM doacao, doacaofenotipo, doador
WHERE 
    doacaofenotipo.doacao = doacao.codigo 
    and doador = doador.codigo
    and doacao.data >= '2012-05-01' 
    and doacao.data <= '2012-05-10'
group by
    doacao.codigo, 
    doador.codigo, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo, 
    doador.rh, 
    doacao.data

Link para o comentário
Compartilhar em outros sites

  • 0

No 8.3 você tem que criar a função de agregação:

create aggregate array_agg (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
)
Depois só muda o nome e os parametros da função chamada:
SELECT 
    doacao.codigo as doacao, 
    doador.codigo as doador, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo as ABO, 
    doador.rh, 
    doacao.data,
    array_agg(
        (select descricao from antigeno where codigo=doacaofenotipo.antigeno)
        || ' ' ||
        doacaofenotipo.resultado
        ) as antigeno_resultado
FROM doacao, doacaofenotipo, doador
WHERE 
    doacaofenotipo.doacao = doacao.codigo 
    and doador = doador.codigo
    and doacao.data >= '2012-05-01' 
    and doacao.data <= '2012-05-10'
group by
    doacao.codigo, 
    doador.codigo, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo, 
    doador.rh, 
    doacao.data

Link para o comentário
Compartilhar em outros sites

  • 0

Então apresentou a mensagem:

ERRO: mais de um registro foi retornado por uma subconsulta utilizada como uma expressão

********** Error **********

ERRO: mais de um registro foi retornado por uma subconsulta utilizada como uma expressão

SQL state: 21000

Agora não entendi, eu mantive a mesma coisa.

=========================================================

No 8.3 você tem que criar a função de agregação:

create aggregate array_agg (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
)
Depois só muda o nome e os parametros da função chamada:
SELECT 
    doacao.codigo as doacao, 
    doador.codigo as doador, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo as ABO, 
    doador.rh, 
    doacao.data,
    array_agg(
        (select descricao from antigeno where codigo=doacaofenotipo.antigeno)
        || ' ' ||
        doacaofenotipo.resultado
        ) as antigeno_resultado
FROM doacao, doacaofenotipo, doador
WHERE 
    doacaofenotipo.doacao = doacao.codigo 
    and doador = doador.codigo
    and doacao.data >= '2012-05-01' 
    and doacao.data <= '2012-05-10'
group by
    doacao.codigo, 
    doador.codigo, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo, 
    doador.rh, 
    doacao.data

Link para o comentário
Compartilhar em outros sites

  • 0

Para corrigir esse erro eu adicionei o limit 1 na subconsulta. Mas não entendi porque não dava esse erro com você. Você incluiu novos registros na tabela antigeno?

SELECT 
    doacao.codigo as doacao, 
    doador.codigo as doador, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo as ABO, 
    doador.rh, 
    doacao.data,
    array_agg(
        (select descricao from antigeno where codigo=doacaofenotipo.antigeno limit 1)
        || ' ' ||
        doacaofenotipo.resultado
        ) as antigeno_resultado
FROM doacao, doacaofenotipo, doador
WHERE 
    doacaofenotipo.doacao = doacao.codigo 
    and doador = doador.codigo
    and doacao.data >= '2012-05-01' 
    and doacao.data <= '2012-05-10'
group by
    doacao.codigo, 
    doador.codigo, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo, 
    doador.rh, 
    doacao.data

Link para o comentário
Compartilhar em outros sites

  • 0

Kakao, fera muito obrigado estava pesquisando sobre isto quando você me respondeu eu tinha colocado o limit no final da query ai estava pesquisando a onde poderia ser inserida logo me respondeu, muito obrigado mesmo e quem manja manja.

"Não existe a pessoa que sabe de tudo, ela pode apenas saber um pouco de cada coisa, mais nunca tudo de tudo !!!"

Obrigado. :rolleyes:

Para corrigir esse erro eu adicionei o limit 1 na subconsulta. Mas não entendi porque não dava esse erro com você. Você incluiu novos registros na tabela antigeno?

SELECT 
    doacao.codigo as doacao, 
    doador.codigo as doador, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo as ABO, 
    doador.rh, 
    doacao.data,
    array_agg(
        (select descricao from antigeno where codigo=doacaofenotipo.antigeno limit 1)
        || ' ' ||
        doacaofenotipo.resultado
        ) as antigeno_resultado
FROM doacao, doacaofenotipo, doador
WHERE 
    doacaofenotipo.doacao = doacao.codigo 
    and doador = doador.codigo
    and doacao.data >= '2012-05-01' 
    and doacao.data <= '2012-05-10'
group by
    doacao.codigo, 
    doador.codigo, 
    doador.nome, 
    doador.sexo, 
    doador.tipo_sanguineo, 
    doador.rh, 
    doacao.data

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...