quarta-feira, 21 de agosto de 2013

Concatenando registros no PostgreSQL e SQL Server

Olá galera,

Hoje falaremos sobre a concatenação de registros com SQL. Vamos adotar uma tabela chamada compras que possui as colunas codigo, cliente, produto já com dados inseridos.

Abaixo o resultado de uma consulta simples com dados hipotéticos.

codigo cliente produto
1 João Cerveja
1 João Carne
1 João Queijo
2 Maria Sabonete
2 Maria Chocolate

Agora imagine um resultado, sem tantas repetições, como a tabela abaixo.

codigo cliente produto
1 João Cerveja, Carne, Queijo
2 Maria Sabonete, Chocolate

No PostgreSQL 9.1 usaremos a função string_agg que aceita uma expressão e um delimitador.

SELECT codigo, cliente, string_agg(produto, ', ') AS produto FROM compras GROUP BY codigo, cliente

Já no SQL Server 2008, já é um pouco mais trabalhoso. Usaremos a função STUFF que insere uma cadeia de caracteres em outra cadeia de caracteres e o comando FOR XML PATH para gerar documentos XML extraídos a partir de um banco de dados.

SELECT codigo, cliente, STUFF((SELECT ', ' + produto FROM compras AS b WHERE a.codigo = b.codigo FOR XML PATH('')), 1, 1, '') AS produto FROM compras AS a GROUP BY codigo, cliente

Conhece outras formas de fazer?! Tem experiências com outros bancos?! Poste um comentário e compartilhe seu conhecimento.

Grande abraço a todos e até a próxima.

4 comentários:

  1. Para as o Oracle 11g release 2 pode-se usar a função LISTAGG() para obter resultado semelhante. Para versões anteriores existe a função wm_concat() que, apesar de não ser suportada e recomendada pela Oracle quebra um grande galho. Mais detalhes e exemplos de uso no link:
    http://oracle-base.com/articles/misc/string-aggregation-techniques.php

    Abraços e parabéns pelo site. Vou guardar nos favoritos pois também trabalho com o PostgreSQL.

    Adilson

    ResponderExcluir
    Respostas
    1. Olá Adilson,

      Muito obrigado por compartilhar seu conhecimento conosco.

      Grande abraço

      Excluir
  2. Procurava a solução do SQL Server a um bom tempo. Muito obrigada por divulgar.

    ResponderExcluir