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!
Um artigo bem completo sobre o assunto pode ser lido aqui: http://lennilobel.wordpress.com/tag/t-sql-running-aggregates/
ResponderExcluirNINJA!
ResponderExcluirMuito útil, agradeço por compartilhar.
ResponderExcluircomo fazer isso no mysql?
ResponderExcluirNo MySQL 8, o sum over foi adicionado como funcionalidade. https://mysqlserverteam.com/mysql-8-0-2-introducing-window-functions/
ResponderExcluirEm 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.