Jump to content
Fórum Script Brasil
  • 0

Consulta no postgresql


Andre P. Vieira
 Share

Question

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 to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 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

Edited by Kakao
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.4k
×
×
  • Create New...