ListAgg: Função Sql

sql_img

Sabe aquela consulta SQL onde deseja retornar diversos valores de um campo específico como coluna e não em várias linhas como estão gravados na tabela?

A função LISTAGG (list aggregate) no banco de dados Oracle faz isso, agrupando os dados na mesma linha de uma instrução SELECT e concatenando o resultado em uma coluna que pode ser utilizada em conjunto com as funções ORDER BY e OVER.

Para demonstrar a sua aplicação em consultas, vamos utilizar as seguintes tabelas:

tabelas
Figura 1. Tabela de pedidos e seus itens

Uma consulta comum unindo estas tabelas exibiria o seguinte resultado em linhas:

consulta-comum
Figura 2. Consulta retornando itens do pedido em linhas

Para mostrar um pedido por linha com todos os itens (código e nome do produto) em uma única coluna separados por “;” utilizamos a função LISTAGG na consulta:

consulta-listagg
Figura 3. Consulta retornando código e nome dos itens concatenadas em única coluna

Na função, informamos  o(s) campo(s) ou expressão que desejamos concatenar e o delimitador de separação como parâmetros. Na expressão WITHIN GROUP é determinado a ordem em que os valores devem ser concatenados para exibição.

Essa função é útil quando desejamos tratar um campo como lista em alguma linguagem de programação, agrupando valores que facilitarão a conversão para objetos. A utilizei especificamente no Java convertendo o ResultSet de uma consulta nativa em um Array de String, mas suas aplicações são diversas.

Referências e Links

http://douglasdba.wordpress.com/2013/07/05/funcao-listagg

http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions089.htm

http://apex.oracle.com

Anúncios

Um comentário

  1. Legal. Tava precisando de algo assim, mas não sabia que existia. Porém pra mim era em PostgreSQL. Mas com base no post, vi que o equivalente ao LISTAGG é string_agg()

    Exemplo: select string_agg(col,’,’) from my_table

Deixe uma resposta