Mostrando entradas con la etiqueta calendario. Mostrar todas las entradas
Mostrando entradas con la etiqueta calendario. Mostrar todas las entradas

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;

► Set Análisis con fechas de 2 calendarios


Imaginad que estamos en mayo de 2018 y tenemos datos de los años 2016, 2017 y hasta mayo de 2018. Además tenemos 2 calendarios diferentes, en una tabla tenemos Año y Mes, que son los usados para hacer los filtros en pantalla y en otra tenemos AÑO_PRESTACION y MES_PRESTACION. Ambas tablas no están unidas, por lo que tenemos que sincronizarlas con SET ANALYSIS


Para jugar con el año actual:

COUNT({<Año=, Mes=, AÑO_PRESTACION={$(vL.AñoActual)}, MES_PRESTACION=p(Mes)>} [%PRESTACION])

  • ·         Si no se selecciona año ni mes: Devuelve los datos de Ene-May de 2018
  • ·         Si se selecciona 2018 (sin mes) devuelve los datos de Ene-May de 2018
  • ·         Si se selecciona 2017 (sin mes) devuelve los datos de Ene-Dic 2017
  • ·         Si se selecciona Mar (sin año) devuelve sólo los datos de Mar-2018
  • ·         Si se selecciona Mar 2017 devuelve sólo los datos de Mar-2017
  • ·         Si se selecciona Ene, Feb, Mar de 2017 devuelve los datos de Ene-Mar 2017



Para jugar con el año anterior:

COUNT({<Año=, Mes=, AÑO_PRESTACION={$(vL.AñoAnterior)}, MES_PRESTACION=p(Mes)>} [%PRESTACION])

Si no se selecciona año, datos de todos los meses disponibles del año anterior. Si se selecciona un mes, datos del año anterior de sólo ese mes. O sea;

  • ·         Si no se selecciona año ni mes: Devuelve los datos de Ene-Dic de 2017
  • ·         Si se selecciona 2018 (sin mes) devuelve los datos de Ene-May de 2017 (may es el máx mes disponible en 2018)
  • ·         Si se selecciona 2017 (sin mes) devuelve los datos de Ene-Dic 2016
  • ·         Si se selecciona Mar (sin año) devuelve sólo los datos de Mar-2017 (recordar que estamos en 2018)
  • ·         Si se selecciona Mar 2017 devuelve sólo los datos de Mar-2016
  • ·         Si se selecciona Ene, Feb, Mar de 2017 devuelve los datos de Ene-Mar 2016


Y para jugar por defecto con el mismo periodo del año anterior que el del año actual:
Si no se selecciona mes, datos del año anterior de los meses disponibles en este año. Si se selecciona un mes, datos del mismo periodo del año anterior que el periodo del año actual.

COUNT({<Año=, Mes=, AÑO_PRESTACION={$(vL.AñoAnterior)}, MES_PRESTACION=p({<Año={$(vL.AñoActual)}>} Mes)>} [%PRESTACION])


  • ·         Si no se selecciona año ni mes: Devuelve los datos de Ene-May de 2017 (may es el máx mes disponible en 2018) Este es la única diferencia respecto al ejemplo anterior.
  • ·         Si se selecciona 2018 (sin mes) devuelve los datos de Ene-May de 2017 (may es el máx mes disponible en 2018)
  • ·         Si se selecciona 2017 (sin mes) devuelve los datos de Ene-Dic 2016
  • ·         Si se selecciona Mar (sin año) devuelve sólo los datos de Mar-2017 (recordar que estamos en 2018)
  • ·         Si se selecciona Mar 2017 devuelve sólo los datos de Mar-2016
  • ·         Si se selecciona Ene, Feb, Mar de 2017 devuelve los datos de Ene-Mar 2016