quinta-feira, 16 de agosto de 2012

Fazendo Totais Acumulados com o OVER e cláusulas ROWS e RANGE

No SQL 2005, a função OVER foi introduzida e nos possibilitou realizar cálculos e somas sub-localizadas dentro de um Dataset. No SQL 2012 estas funções ganharam alguns enhancements, que acabei de utilizar em um cliente que são as cláusulas ROWS e RANGE, permitindo realizar com mais facilidade os totais acumulados.

O projeto de BI que estou envolvido, me exigiu subtotais de valores acumulados por uma determinada condição dentro de um Dataset. Abaixo criei um pequeno exemplo similar ao que realizei:


create table MyTable(
  codigo int identity(1,1)
  ,Grupo varchar(100)
  ,Data Datetime
  ,valor Money
)
go

insert into MyTable values ('Tecnologia',Getdate()-5,100)
insert into MyTable values ('Tecnologia',Getdate()-4,230)
insert into MyTable values ('Tecnologia',Getdate()-3,760)
insert into MyTable values ('Administração',Getdate()-5,980)
insert into MyTable values ('Administração',Getdate()-4,350)
insert into MyTable values ('Administração',Getdate()-3,910)
insert into MyTable values ('Biologia',Getdate()-5,360)
insert into MyTable values ('Biologia',Getdate()-4,570)
insert into MyTable values ('Biologia',Getdate()-3,870)

select 
* ,
SUM(valor) OVER (PARTITION BY grupo ORDER BY grupo rows UNBOUNDED PRECEDING) as [Coluna Acumulada]
from MyTable
order by grupo

Reparem na clásula UNBOUDED PRECEDING que especifica que a soma começa no início da partição, especificada em PARTITION.

Abs!

5 comentários:

  1. Um artigo bem completo sobre o assunto pode ser lido aqui: http://lennilobel.wordpress.com/tag/t-sql-running-aggregates/

    ResponderExcluir
  2. Muito útil, agradeço por compartilhar.

    ResponderExcluir
  3. No MySQL 8, o sum over foi adicionado como funcionalidade. https://mysqlserverteam.com/mysql-8-0-2-introducing-window-functions/

    Em versões anteriores realmente não tem, mas vc pode tentar fazer isso na sua interface de apresnetação ou ferramenta de relatório como o power bi.

    ResponderExcluir

Leave your comment here!