Olá galera o/

No post de hoje, iremos aprender sobre a função STRING_AGG do SQL Server. Descobriremos seu funcionamento, entenderemos seus parâmetros e exploraremos maneiras de aplicá-la em nossos projetos e estudo utilizando exemplo práticos.

O que o STRING_AGG?

É uma função de agregação introduzida a partir da versão 2017 do SQL Server que permite concatenar os valores de uma coluna em uma única string, separados por um delimitador especificado.

Sintaxe

STRING_AGG (expression, separator)

  • expression: A expressão a ser concatenada.
  • separator: O separador a ser utilizado entre os valores concatenados.

Prática – Criando Tabelas e inserindo registros!

Primeiro, vamos criar duas tabelas temporárias e inserir seus respectivos dados para entendermos o funcionamento da função. Uma tabela conterá dados de filiais e seus respectivos gerentes, e a outra tabela conterá as provas dos alunos de uma faculdade de tecnologia.

create table #tb_filiais
(
filial_id int identity primary key,
filial_nome varchar (20),
filial_estado char(2),
filial_gerente varchar(50)
)

INSERT INTO #tb_filiais (filial_nome, filial_estado, filial_gerente)
VALUES
('Filial Alpha', 'PE', 'João Silva'),
('Filial Alpha', 'PE', 'Maria Souza'),
('Filial Beta', 'RJ', 'Pedro Santos'),
('Filial Gamma', 'MG', 'Ana Oliveira'),
('Filial Gamma', 'MG', 'Carlos Costa'),
('Filial Delta', 'RS', 'Fernanda Almeida'),
('Filial Epsilon', 'PR', 'Rafael Pereira'),
('Filial Zeta', 'SC', 'Juliana Mendes'),
('Filial Theta', 'BA', 'Rodrigo Marques'),
('Filial Theta', 'BA', 'Isabela Fernandes'),
('Filial Iota', 'PE', 'Larissa Lima'),
('Filial Kappa', 'CE', 'Bruno Oliveira'),
('Filial Kappa', 'CE', 'Camila Santos'),
('Filial Lambda', 'AM', 'Gustavo Alves');

create table #tb_prova
(
prova_id int identity primary key,
prova_disciplina varchar (50),
prova_aluno varchar(50),
prova_unidade varchar(50),
prova_nota numeric(5,2)
)

INSERT INTO #tb_prova (prova_disciplina, prova_aluno, prova_unidade, prova_nota)
VALUES
('Modelagem de Dados', 'João Silva', '1ª unidade', 8.5),
('Modelagem de Dados', 'Maria Souza', '1ª unidade', 7.9),
('Modelagem de Dados', 'Pedro Santos', '1ª unidade', 6.8),
('Linguagem T-SQL', 'Ana Oliveira', '1ª unidade', 9.3),
('Linguagem T-SQL', 'Carlos Costa', '1ª unidade', 7.2),
('Conceitos de Big Data', 'Fernanda Almeida', '1ª unidade', 8.0),
('Conceitos de Big Data', 'Rafael Pereira', '1ª unidade', 9.5),
('Conceitos de Big Data', 'Larissa Lima', '1ª unidade', 5.0),
('BI Tradicional', 'Juliana Mendes', '1ª unidade', 7.6),
('BI Tradicional', 'Rodrigo Marques', '1ª unidade', 6.9),
('BI Tradicional', 'Carlos Costa', '1ª unidade', 0.0),
('Cloud Computing', 'Isabela Fernandes', '1ª unidade', 8.7),
('Cloud Computing', 'Larissa Lima', '1ª unidade', 7.4),
('Cloud Computing', 'Bruno Oliveira', '1ª unidade', 8.2),
('Modelagem de Dados', 'João Silva', '2ª unidade', 7.8),
('Modelagem de Dados', 'Maria Souza', '2ª unidade', 8.3),
('Modelagem de Dados', 'Pedro Santos', '2ª unidade', 9.0),
('Linguagem T-SQL', 'Ana Oliveira', '2ª unidade', 6.7),
('Linguagem T-SQL', 'Carlos Costa', '2ª unidade', 8.9),
('Conceitos de Big Data', 'Fernanda Almeida', '2ª unidade', 7.5),
('Conceitos de Big Data', 'Rafael Pereira', '2ª unidade', 8.6),
('Conceitos de Big Data', 'Larissa Lima', '2ª unidade', 9.0),
('BI Tradicional', 'Juliana Mendes', '2ª unidade', 9.2),
('BI Tradicional', 'Rodrigo Marques', '2ª unidade', 8.4),
('BI Tradicional', 'Carlos Costa', '2ª unidade', 10.0),
('Cloud Computing', 'Isabela Fernandes', '2ª unidade', 7.1),
('Cloud Computing', 'Larissa Lima', '2ª unidade', 8.1),
('Cloud Computing', 'Bruno Oliveira', '2ª unidade', 9.4);

Prática – Utilizando o STRING_AGG!

Agora vamos fazer nossas queries para entendermos o funcionamento da função. Primeiro iremos focar na tabela de filiais respondendo algumas perguntas de negócio através do STRING_AGG.

1 – Iremos selecionar os estados das filiais, juntamente com a lista de gerentes separados por ponto e vírgula para cada estado, além disso, vamos contar a quantidade de gerentes por estado. Primeiro, a query agrupa as filiais por estado usando o comando GROUP BY. Em seguida, a função STRING_AGG é utilizada para concatenar os nomes dos gerentes separados por ponto e vírgula para cada estado. Após a função STRING_AGG, adicionamos a função COUNT para contar quantos gerentes estão associados a cada estado.

select 
filial_estado
, STRING_AGG(filial_gerente, '; ') as gerentes
, count(filial_gerente) as qtd_gerentes
from #tb_filiais
group by filial_estado
order by qtd_gerentes desc

2 – Iremos selecionar os estados das filiais juntamente com uma lista de nomes das filiais separados por ponto e vírgula para cada estado. Primeiro, a query agrupa as filiais por estado usando o comando GROUP BY. Em seguida, a função STRING_AGG é utilizada para concatenar os nomes das filiais separados por ponto e vírgula.

select 
filial_estado
, STRING_AGG(filial_nome, '; ') as filiais
from #tb_filiais
group by filial_estado

3 – Vocês devem ter percebido que alguns nomes apareceram repetidos nas consultas acima. Vamos simular aplicando a STRING_AGG apenas na coluna filial_nome.

Iremos utilizar o conceito de tabela derivada (ou subconsulta de tabela) para gerar o nome das filiais sem a repetição, na consulta mais externa que é resultado da tabela derivada aplicaamos a função. Isso garante que cada nome de filial apareça apenas uma vez na lista concatenada. O resultado é semelhante ao da primeira consulta, mas elimina quaisquer duplicatas de nomes de filiais antes de concatená-los. Podemos utilizar várias abordagens para resolver este caso como por exemplo CTE e SELF JOIN.

select  STRING_AGG( filial_nome, ';') as filiais
from #tb_filiais
SELECT STRING_AGG(filial_nome, ';') AS filiais
FROM (
SELECT DISTINCT filial_nome
FROM #tb_filiais
) AS tb_derivada;

1 – Iremos selecionar os nomes dos alunos juntamente com uma lista das disciplinas que cada aluno cursou, separadas por uma barra vertical (pipe) e um espaço (‘ | ‘). A função STRING_AGG é utilizada para concatenar os nomes das disciplinas que o aluno cursou, separados pelo delimitador especificado (‘ | ‘). O resultado final é uma lista de alunos com suas respectivas disciplinas cursadas, lembrando que, o nome da disciplina aparece duplicada porque o aluno possui notas nas duas unidades existentes (primeira e segunda).

select
prova_aluno
,STRING_AGG(prova_disciplina, ' | ') as disciplinas
from #tb_prova
group by prova_aluno

2 – Agora iremos selecionar as disciplinas das provas juntamente com uma lista dos alunos que cursaram cada disciplina, separados por ponto e vírgula seguido de um espaço (‘; ‘). A função STRING_AGG é utilizada para concatenar os nomes dos alunos que cursaram essa disciplina, separados pelo delimitador especificado (‘; ‘). O resultado final é uma lista de disciplinas com os respectivos alunos que as cursaram. Novamente o nome dos alunos duplicaram.

select
prova_disciplina
,STRING_AGG(prova_aluno, '; ') as disciplinas
from #tb_prova
group by prova_disciplina

3 – Agora iremos resolver as duplicações utilizando novamente a tabela derivada. A query mais interna realizamos uma subconsulta que agrupa os registros da tabela #tb_prova pelo nome da disciplina e pelo nome do aluno usando o comando GROUP BY. Para cada combinação de disciplina e aluno, é calculada a média das notas das provas (AVG(prova_nota)), que é nomeada como media. A tabela derivada devolverá para a consulta externa 3 colunas.

Na consulta externa selecionaremos a coluna prova_disciplina como uma coluna de agrupamento. A função STRING_AGG concatenará os nomes dos alunos com suas respectivas médias de nota, formatadas com duas casas decimais (FORMAT(media, 'N2')), separadas por ponto e vírgula seguido de um espaço (; ). Utilizamos a função CONCAT para juntar os valores do nome do aluno + sua média da disciplina em questão.

select prova_disciplina
,STRING_AGG(concat(prova_aluno, '-', FORMAT(media, 'N2')), '; ') as disciplinas
from (
select
prova_disciplina
,prova_aluno
,avg(prova_nota) as media
from #tb_prova
group by prova_disciplina,prova_aluno
) as tb_derivada_prova
group by prova_disciplina

Considerações Finais!

Neste post, exploramos a função STRING_AGG no SQL Server em detalhes, discutindo sua sintaxe, parâmetros e como usá-la para concatenar strings de várias linhas em uma única string. Também fornecemos exemplos práticos para ilustrar seu uso em diferentes cenários.

Espero que tenham gostado, boa leitura, boa prática e bons estudos.

Quem quiser mandar comentários, sugestões, críticas ou dicas complementares, fiquem a vontade, pois feedbacks positivos ou negativos engradecem meu conhecimento para poder melhorar as postagens para vocês.

Até a próxima o/

Acessem nossas Redes Sociais: