|

É uma boa ideia utilizar COMPUTE e COMPUTE BY no SQL Server?

Compartilhe :

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

  1. Estão obsoletas (deprecated): desde o SQL Server 2012, a documentação oficial da Microsoft marca COMPUTE e COMPUTE BY como recursos mantidos apenas por compatibilidade regressiva, sem garantia de suporte em versões futuras.
  2. 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.
  3. Sem suporte em ferramentas modernas: muitos drivers e frameworks atuais simplesmente não sabem tratar esse tipo de resultado misto.
  4. 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.

Posts Similares