Muitas vezes, queremos juntar (concatenar) os registros, mas agrupando não podemos ter uma leitura dos mesmos imediata. Foi então que eu vi a necessidade de procurar um comando para realizar essa concatenação.

Pesquisei em alguns fóruns e na documentação oficial da Microsoft, perguntei alguns amigos e colegas e cheguei no resultado que eu esperava.

O primeiro passo, vamos começar criando uma Base de estudos, para que desastres não aconteçam…

USE master;
GO

---- VERIFICANDO SE EXISTE O BANCO DE DADOS, CASO EXISTA APAGA ----
IF DB_ID (N'MEUSTESTES') IS NOT NULL DROP DATABASE MEUSTESTES;
GO

-------- CRIANDO O BANCO DE DADOS -----------
CREATE DATABASE MEUSTESTES;
GO

--------- USANDO O BANDO DE DADOS CRIADO ---------
USE MEUSTESTES;
GO

Certo, criado a Base ‘MEUSTESTES’, partiremos para a tabela. Aqui vou usar uma tabela Vendas com os campos NOME, COD_VDDR, MES e TICKET.

--------- CRIANDO A TABELA PARA O EXEMPLO ---------
CREATE TABLE Vendas(
	NOME VARCHAR(50),
	COD_VDDR INT,
	MES VARCHAR (50),
	TICKET INT
);
GO

E é claro, vamos popular nossa tabela, para começar.

------------- POPULANDO A TABELA CRIADA -----------------
INSERT INTO Vendas VALUES 
('Pedro',101,'Jan',2020001),
('Maria',102,'Jan',2020002),
('Maria',102,'Jan',2020003),
('Pedro',101,'Jan',2020004),
('Pedro',101,'Jan',2020005),
('Maria',102,'Jan',2020006),
('Maria',102,'Jan',2020007),
('Pedro',101,'Jan',2020008),
('Pedro',101,'Jan',2020009),
('Maria',102,'Jan',2020010),
('Ana',103,'Jan',2020011);
GO

Certo, agora que já temos toda a estrutura montada é só iniciar a diversão certo?

Usei o comando STUFF e como ele trabalha com strings eu converti o resultado da coluna TICKETS em varchar e dei o alias de TICKETS novamente.

Comparei os dados, usando isnull do bloco dentro do stuff, com o bloco da tabela original, ordenei pela unica do stuff usei o xml path para formatar a concatenação e fechei o stuff dando o nome da coluna original.

---------- concatenação de dados utilizando agrupamentos ---------
SELECT A.NOME, A.COD_VDDR, A.MES,						
		  STUFF((	
			SELECT ', ' + CAST(B.Ticket AS varchar(10)) 
			FROM Vendas B
			WHERE ISNULL(B.NOME, '') = ISNULL(A.NOME, '') 
			ORDER BY B.TICKET		
			FOR XML PATH('')), 1, 1, ''	
		  ) AS TICKETS
FROM Vendas A			
GROUP BY NOME, COD_VDDR, MES
ORDER BY COD_VDDR

Abaixo o resultado do select comum e concatenado para ter uma melhor visão.

Não foi fornecido texto alternativo para esta imagem

Então galera, por hoje é essa a dica, espero que tenham gostado e que em algum momento ajude vocês.

Fonte de pesquisa:

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

Deixe um Comentário