Realizando um UNPIVOT separando colunas com ";" com cross apply ou string_Agg.

Hello my friends!! Como estão? Espero sempre que estejam muito bem.

 Hoje gostaria de dar uma dica para vocês que pode ajudar bastante. Esses dias estava trabalhando quando o head da área me manda um dúvida que surgiu em dos grupos que ele estar de SQL, a primeira pergunta que fiz, foi "Nossa, que grupo técnico de SQL é esse? Que não estou", my bad :( rs. 

Bem a dúvida era como fazer um "UNPIVOT"  no SQL? Bem existe o comando Pivot /Unpivot, mas hoje gostaria de mostrar formas diferentes de fazer o UNPIVOT. O cliente tinha uma tabela com as seguintes informações:

Ele queria agrupar  campo "nota" e colocar o campo "Produto" em uma linha separando esses produtos com ";"

Assim:

Para fazer isso de forma bem simples, podemos usar o string_agg, uma função excelente de concatenação e agregação do SQL, mas cuidado, pois só estar disponível a partir do SQL 2017
Segue código:


---Opção  1, sql 2017 + 
select nota,STRING_AGG(produto,';') as 'unpivot' from #teste
group by nota

Outra forma simples é usando cross apply  com for xml path e stuff:


select   nota,STUFF(d.teste,1,1,'')  as 'unpivot' from  #teste a
cross apply
(
select';'+ produto from #teste b
where a.nota =  b.nota
for xml path('')
) d(teste)
group by  nota,STUFF(d.teste,1,1,'')


Pessoal, caso tenha dúvida do operador apply, recomendado a leitura do artigo do Marcio Junior,
segue link: https://vulgomarcio.home.blog/2019/08/05/voce-conhece-o-operador-apply/amp/


Operador STUFF: https://docs.microsoft.com/pt-br/sql/t-sql/functions/stuff-transact-sql?view=sql-server-ver15


Bem pessoal, a dica de hoje é bem simples, até a próxima :)








Comentários

Postagens mais visitadas deste blog

Tuning no Postgres utlizando View Materializada

Como realizei um tuning que caiu o tempo de execução de 8h para 7minutos!

Procedure que cria um script de insert.