Neste tutorial, vamos explorar como agrupar dados por uma coluna, como no nosso exemplo Id
, sem precisar fazer um GROUP BY
. Para isso, vamos usar o conceito de Funções de Janela.
O Que São Funções de Janela no SQL Server?
As funções de janela no SQL Server são utilizadas para aplicar cálculos de agregação sem a necessidade de agrupar as linhas com o comando GROUP BY
. Isso permite que você realize operações como somar, contar ou calcular a média dos dados, mantendo todas as linhas visíveis. Isso é muito útil quando você precisa de análises detalhadas e agregadas ao mesmo tempo, sem perder a individualidade dos dados.
Vamos usar um exemplo prático para ilustrar como as funções de janela podem ser usadas para calcular totais, médias, contagens e outras métricas dentro de cada grupo de dados, no caso, cada time identificado pelo Id
. Em vez de usar GROUP BY
, vamos aplicar as funções de janela para calcular esses agregados sem perder as informações individuais de cada jogador do nosso Corinthians.
Código SQL para Calcular Totais, Médias e Outras Métricas
DECLARE @TB_TESTE TABLE (Id int, Nome varchar(max), Valor decimal(18,2))
INSERT INTO @TB_TESTE
VALUES
(1, 'Craque Neto', 5000),
(1, 'Marcelinho Carioca', 1000.2),
(2, 'Socrates', 3321),
(3, 'Cassio', 3321),
(3, 'Yuri Alberto', 3321)
SELECT
*,
SUM(Valor) OVER (PARTITION BY Id) AS Total,
AVG(Valor) OVER (PARTITION BY Id) AS [Avg],
COUNT(Valor) OVER (PARTITION BY Id) AS [Count],
MIN(Valor) OVER (PARTITION BY Id) AS [Min],
MAX(Valor) OVER (PARTITION BY Id) AS [Max]
FROM @TB_TESTE
Como Funciona a Cláusula OVER()
?
Ao usar a função de janela OVER()
, você pode especificar que deseja calcular agregados, como a soma, a média ou a contagem, sem agrupar os dados. Isso é feito usando a cláusula PARTITION BY
, que permite dividir os dados em grupos. No exemplo acima, estamos calculando os totais, médias e outras métricas por time (Id
), mantendo as linhas de cada jogador intactas.
O uso da cláusula OVER()
nos permite calcular as agregações para cada grupo (ou Id
, no nosso exemplo) sem a necessidade de agrupar os dados. O resultado será uma tabela como esta:
Id | Nome | Valor | Total | Avg | Count | Min | Max |
---|---|---|---|---|---|---|---|
1 | Craque Neto | 5000.00 | 6000.20 | 3000.100000 | 2 | 1000.20 | 5000.00 |
1 | Marcelinho Carioca | 1000.20 | 6000.20 | 3000.100000 | 2 | 1000.20 | 5000.00 |
2 | Socrates | 3321.00 | 3321.00 | 3321.000000 | 1 | 3321.00 | 3321.00 |
3 | Cassio | 3321.00 | 6642.00 | 3321.000000 | 2 | 3321.00 | 3321.00 |
3 | Yuri Alberto | 3321.00 | 6642.00 | 3321.000000 | 2 | 3321.00 | 3321.00 |
Saiba mais
Se você quiser explorar mais variações do uso da cláusula OVER()
para outras funções de agregação e calcular métricas em diferentes tipos de dados, acesse a documentação oficial do SQL Server.