Firebird – CTE x Criando dimensão tempo

Emprestado de BI, fazer agrupamentos que mostre dados em dimensão de tempo é uma ferramenta
de grande ajuda.
São diversas as situações onde é aplicável dimensionamento de dados por tempo – melhor utilizar
exemplos:
Ex: Deseja saber qual dia da semana as vendas são mais concentradas – Seg, Ter, Qua, Qui, Sex,
Sab, Dom….

with CTE as
(
     select data,wdia,cdia from DIM_DATE('12/01/2015','12/31/2015')
)
Select d.wdia as dia, d.cdia as cdia, sum(valor) as Valor
from cte d join TAB_VENDAS a on (d.data=a.data)
group by d.wdia,d.cdia

Código para a procedure DIM_DATE:

SET TERM ^ ;
CREATE OR ALTER PROCEDURE DIM_DATE (
p_data_de date,
p_data_ate date)
returns (
   data date,
   dia integer,
   wdia integer,
   cdia varchar(1),
   mes integer,
   ano integer,
   semestre integer,
   trimestre integer,
   nsemana integer,
   inimes date,
   fimmes date)
as
declare variable dt date;
begin
   dt = :p_data_de;
   while (dt <= :p_data_ate ) do
   begin
     data = :dt;
     dia = extract(day from :dt);
     wdia = extract(weekday from :dt); -- cdia base
     cdia = substr('DSTQQSS',wdia+1,wdia+1);
     mes = extract(month from :dt);
     ano = extract(year from :dt);
     semestre = case when mes<=6 then 1 else 2 end;
     trimestre = trunc((mes-1) / 3)+1;
     inimes = :dt - dia +1;
     fimmes = dateadd(month, 1,:inimes) - 1;
     nsemana = extract(week from :data);
     suspend;
     dt = dt+1;
   end
end^
SET TERM ; ^
GRANT EXECUTE ON PROCEDURE DIM_DATE TO SYSDBA;

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *