É uma boa ideia utilizar COMPUTE e COMPUTE BY no SQL Server?
Resposta curta: não. As cláusulas COMPUTE e COMPUTE BY existem no MS SQL Server apenas por compatibilidade com versões muito antigas do produto e a própria Microsoft recomenda evitá-las em qualquer desenvolvimento novo. Neste artigo você vai entender o que essas cláusulas fazem, ver exemplos práticos e conhecer as alternativas modernas que devem ser usadas no lugar delas.
O que fazem o COMPUTE e o COMPUTE BY
Essas cláusulas permitem exibir, numa mesma instrução SELECT, tanto as linhas de detalhe quanto uma linha extra de resumo (soma, média, mínimo, máximo ou contagem) — sem precisar de uma segunda consulta.
- COMPUTE: gera um valor de resumo para o conjunto de resultados inteiro.
-
COMPUTE BY: gera um valor de resumo para cada subgrupo, com base em uma coluna específica (a consulta precisa estar ordenada por essa coluna com
ORDER BY).
A cláusula aceita uma função de agregação (SUM, AVG, MIN, MAX ou COUNT) aplicada a uma coluna do resultado.
Exemplo prático
-- Resumo geral: valor total de todos os pedidos
SELECT ProdutoID, Quantidade, ValorUnitario
FROM Pedidos
COMPUTE SUM(ValorUnitario)
-- Resumo por grupo: total de vendas por vendedor
SELECT VendedorID, ProdutoID, ValorVenda
FROM Vendas
ORDER BY VendedorID
COMPUTE SUM(ValorVenda) BY VendedorID
No segundo exemplo, o SQL Server exibe as linhas de detalhe de cada vendedor e, ao final de cada grupo, uma linha extra com o total daquele vendedor.
Por que evitar essas cláusulas
-
Estão obsoletas (deprecated): desde o SQL Server 2012, a documentação oficial da Microsoft marca
COMPUTEeCOMPUTE BYcomo recursos mantidos apenas por compatibilidade regressiva, sem garantia de suporte em versões futuras. - Resultado difícil de consumir: o retorno não é um único conjunto tabular — é uma mistura de linhas de detalhe com linhas de resumo em formato diferente. Isso complica (ou impede) o consumo por ORMs, bibliotecas de acesso a dados e ferramentas de BI, que esperam um resultset uniforme.
- Sem suporte em ferramentas modernas: muitos drivers e frameworks atuais simplesmente não sabem tratar esse tipo de resultado misto.
- Existem alternativas melhores e padronizadas em SQL.
O que usar no lugar
GROUP BY (para resumos por grupo)
SELECT VendedorID, SUM(ValorVenda) AS TotalVendas
FROM Vendas
GROUP BY VendedorID
ROLLUP (para totais e subtotais, incluindo o total geral)
SELECT VendedorID, SUM(ValorVenda) AS TotalVendas
FROM Vendas
GROUP BY ROLLUP(VendedorID)
Funções de janela (para exibir o resumo ao lado de cada linha de detalhe, que era o principal caso de uso do COMPUTE)
SELECT
VendedorID,
ProdutoID,
ValorVenda,
SUM(ValorVenda) OVER (PARTITION BY VendedorID) AS TotalDoVendedor
FROM Vendas
Essa última opção, com OVER (PARTITION BY ...), é normalmente a substituta mais direta do COMPUTE BY: ela mostra o detalhe e o total lado a lado, mas em um único resultset limpo, compatível com qualquer ferramenta.
Conclusão
COMPUTE e COMPUTE BY foram úteis nas primeiras versões do SQL Server, mas hoje são um recurso legado. Se você encontrar esse código em um sistema antigo, vale a pena planejar a migração para GROUP BY, ROLLUP/CUBE ou funções de janela — são mais rápidos de manter, têm melhor suporte de ferramentas e não correm o risco de serem removidos em uma versão futura do produto.