SQLServer - usando o rollup para quebrar e somar grupo, subgrupo e produto

Top  Previous  Next

select 

  --codigo do grupo 

  case when (grouping(g.cod_grupo) = 1) then 

   -1

  else 

   g.cod_grupo 

  end as cod_grupo,

  

  --descricao do grupo

  case when (grouping(g.nome) = 1) then 

   isnull((select nome from grupo where cod_grupo = g.cod_grupo),'ZTOTAL')                         

  else 

   g.nome 

  end as gruponome,

  

  --codigo do subgrupo

  case when (grouping(p.cod_sub) = 1) then 

   -1    

  else 

   p.cod_sub 

  end as cod_sub,

  

  --descricao do subgrupo

  case when (grouping(s.nome) = 1) then 

   isnull((select nome from sub where cod_grupo = g.cod_grupo and cod_sub = p.cod_sub),'ZTOTAL'

  else 

   s.nome  

  end as subnome, 

  

  --codigo do produto

  case when (grouping(p.cod_prod) = 1) then 

   -1

  else 

   p.cod_prod 

  end as cod_prod,

  

  --descricao do produto

  case when (grouping(p.nome) = 1) then 

   'ZTOTAL' 

  else 

   p.nome

  end as nome,

  

  --finalmente a soma! 

  sum(p.valor) as soma

 

from prod p

 

inner join sub   s on (s.cod_sub   = p.cod_sub) 

inner join grupo g on (g.cod_grupo = s.cod_grupo)

 

group by g.cod_grupo, g.nome, p.cod_sub, s.nome, p.cod_prod, p.nome with rollup

 

--having é que faz a magica

having (g.nome is null or not p.cod_sub is nulland (s.nome is null or not p.nome is null)

order by gruponome, subnome, nome