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.
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:
ResponderExcluirhttp://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
Olá Adilson,
ExcluirMuito obrigado por compartilhar seu conhecimento conosco.
Grande abraço
Procurava a solução do SQL Server a um bom tempo. Muito obrigada por divulgar.
ResponderExcluirMuito bom!
ResponderExcluirExcelente. Obrigado.
ResponderExcluir