Cuando
utilizamos una dimensión de fecha en la que puede haber vacíos de información,
lo normal es crear un calendario que nos rellene esos huecos.
El
ejemplo típico es la del negocio que cierra fines de semana y un mes en verano.
Si utilizásemos como dimensión, por ejemplo, la fecha de las facturas, nos
encontraríamos que nos faltarían todos los fines de semana y el mes de agosto
completo, lo que hace que cuando mostremos la información nos aparezcan huecos
poco atractivos.
Por eso,
lo mejor es crear un calendario. Pero yendo un poco más allá, casi siempre nos
surgen preguntas como… ¿Cuál es mi beneficio en lo que va de año? ¿Y respecto
al mismo periodo del año anterior? ¿Y respecto al mes anterior?... y así infinidad
de preguntas similares.
Si sólo
tenemos el calendario con años, meses y días, las comparaciones que necesitamos
hacer luego en los set analysis de las expresiones son bastante complejos.
Todo se simplifica bastante añadiendo un campo a nuestro calendario que concatene el año y el mes. De esta forma tendremos un campo numérico que podremos ordenar y comparar.
Todo se simplifica bastante añadiendo un campo a nuestro calendario que concatene el año y el mes. De esta forma tendremos un campo numérico que podremos ordenar y comparar.
En el
ejemplo utilizamos un campo llamado F_Entrada como fecha para enlazar con el
resto del modelo y creamos un campo Periodo (YYYYMM) y PeriodoDia (YYYYMMDD)
LOAD
date(min([F_Entrada])) as "FechaInicio"
Resident Operaciones;
FechaFin:
LOAD
date(max([F_Entrada])) as "FechaFin"
Resident Operaciones;
let vL.MinDate=num(peek('FechaInicio',0,'FechaInicio'));
let vL.MaxDate=num(peek('FechaFin',0,'FechaFin'));
CALENDARIO_MAESTRO:
LOAD date(recno()+$(vL.MinDate)-1, 'DD/MM/YYYY') as "F_Entrada",
year(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY'))*100+ month(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY')) as Periodo,
num#(date(RecNo()+$(vL.MinDate)-1,'YYYYMMDD')) as PeriodoDia,
year(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY')) as "Año",
week(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY'),0,1) as num_semana,
Date(MonthStart(date(RecNo()+$(vL.MinDate)-1,'YYYYMMDD')),'YYYY MMM') AS Año_Mes,
'T' & ceil(month(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY'))/3) as "Trimestre",
month(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY')) as "Mes",
year(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY'))&'-'&week(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY'),0,1) as Año_Semana,
weekStart(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY')) &'->'& weekEND(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY')) as "Semana",
Day(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY')) as "Día",
date(RecNo()+$(vL.MinDate)-2,'DD/MM/YYYY') as "Ayer",
WeekDay(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY')) as "Día Sem.",
Text(date(RecNo()+$(vL.MinDate)-1,'WWWW')) as "Día Semana",
DUAL(month(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY'))&'-'&Day(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY')),
month(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY'))*100+Day(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY'))) As Mes_Dia,
TEXT(Date(RecNo()+$(vL.MinDate)-1,'MMMM')) AS Meslargo,
If( date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY') >= YearStart(Today()) AND date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY') <= today(), 1,0) as IsInYTD, //ejemplo de uso: Sum( {$<IsInYTD={1}>} Amount )
If( date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY') >= YearStart(addyears(Today(),-1)) AND date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY') <= addyears(Today(),-1), 1,0) as IsInPrevYTD,//ejemplo de uso: Sum( {$<IsInPrevYTD={1}>} Amount )
If( (date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY') >= YearStart(Today()) AND date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY') <= today())
OR(date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY') >= YearStart(addyears(Today(),-1)) AND date(RecNo()+$(vL.MinDate)-1,'DD/MM/YYYY') <= addyears(Today(),-1)), 1,0) as IsInPrev2YTD
AUTOGENERATE $(vL.MaxDate)-$(vL.MinDate)+1 ;
Drop table FechaInicio, FechaFin;