Patrón #2: Tabla de Calendario

Power BI logo

Disponer de la tabla de calendario o Fechas en Power BI es casi obligatorio dado que generalmente realizamos análisis temporales y necesitamos analizar información por año, trimestre, meses, semanas, días... De esta forma, podemos tener todas las columnas referentes a tiempo para las fechas que utilicemos en las tablas de hechos evitando duplicar campos innecesarios.

Paso 1. Crear dos medidas que llamaremos Fecha Min y Fecha Max:

Fecha Min =
DATE ( YEAR ( MIN ( Ventas[Fecha Registro] ) )11 )

Fecha Max =
DATE ( YEAR ( MAX ( Ventas[Fecha Registro] ) )1231 )

Fecha Max =
DATE ( YEAR ( MAX ( Ventas[Fecha Registro] ) )MONTH ( TODAY () )DAY ( TODAY () ) )

Paso 2. Crear la tabla Calendario:

Calendario =
ADDCOLUMNS (
    CALENDAR ( [Fecha Min], [Fecha Max] ),
    "idFecha"FORMAT ( [Date], "YYYYMMDD" ),
    "Fecha"DATE ( YEAR ( [Date] )MONTH ( [Date] )DAY ( [Date] ) ),
    "Fecha PY"DATE ( YEAR ( [Date] ) - 1MONTH ( [Date] )DAY ( [Date] ) ),
    "Año"YEAR ( [Date] ),
    "Trimestre""T" & FORMAT ( [Date], "Q" ),
    "Mes"FORMAT ( [Date], "mmm" ),
    "MesLargo"FORMAT ( [Date], "mmmm" ),
    "DiaSemana"FORMAT ( [Date], "ddd" ),
    "DiaSemanaLargo"FORMAT ( [Date], "dddd" ),
    "AñoTrimestre",
        FORMAT ( [Date], "YYYY" ) & "/T"
            FORMAT ( [Date], "Q" ),
    "AñoMes"FORMAT ( [Date], "YYYY/MM" ),
    "AñoMesCorto"FORMAT ( [Date], "YYYY/mmm" ),
    "Semana"WEEKNUM ( [Date], 2 ),
    "MesNum"FORMAT ( [Date], "MM" ),
    "DiaAñoNum",
        IF (
             (
                 ( DATE ( YEAR ( [Date] )1231 ) - DATE ( YEAR ( [Date] )11 ) ) = 365
                    && [Date] > DATE ( YEAR ( [Date] )229 )
            ),
            DATEDIFF ( DATE ( YEAR ( [Date] )11 ), [Date], DAY ),
            DATEDIFF ( DATE ( YEAR ( [Date] )11 ), [Date], DAY ) + 1
        ),
    "DiaMesNum"DAY ( [Date] ),
    "DiaSemanaNum"WEEKDAY ( [Date], 2 ),
    "Años"ROUNDDOWN ( YEAR ( [Date] ) - YEAR ( [Fecha Min] )0 ),
    "Meses",
        ROUNDDOWN ( YEAR ( [Date] ) - YEAR ( [Fecha Min] )0 ) * 12
            MONTH ( [Date] )
)

Paso 3. Crear dos nuevas columnas:

DiasMesNum =
DAY ( ENDOFMONTH ( Calendario[Fecha] ) )

//Columna NumSecuencial NO TIENE en cuenta los años bisiestos

NumSecuencial =
CALCULATE (
    COUNT ( [Fecha] ),
    ALL ( Calendario[Fecha] ),
    FILTER ( Calendario, [fecha] <= EARLIER ( [Fecha] ) )
)

//Columna NumSecuencial SÍ TIENE en cuenta los años bisiestos

NumSecuencial =
COUNTROWS (
    FILTER (
        ALL ( Calendario ),
        Calendario[Date] <= EARLIER ( Calendario[Date] )
            && NOT (
                MONTH ( Calendario[Date] ) = 2
                    && DAY ( Calendario[Date] ) = 29
            )
    )
)

Paso 4. Revisar que Fecha, Fecha PY y Date son de tipo de dato Fecha DD/MM/YYYY y el campo de relación también.

Paso 5. La relación tiene que ser UNIDIRECCIONAL de la tabla Calendario a la/s tabla/s de hechos.

Paso 6. Marcar la tabla de Calendario como tabla de fechas dado que algunos de los cálculos utilizarán funciones de tiempo de DAX avanzadas. Para ello, pinchar en "Datos" de la barra lateral izquierda, marcar la tabla de Calendario creada, y en la opción de ribbon Modelado | Marcar como tabla de fechas. Elegir el campo clave primaria, es el campo Date.
https://sqldusty.com/2015/09/01/10-dax-calculations-for-your-tabular-or-power-pivot-model-part-1/