domingo, 18 de noviembre de 2018

► Calendario con periodos

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.

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)

FechaInicio:
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;

No hay comentarios:

Publicar un comentario