Anderson Camilo Rodriguez Salvador
Alexis Aquino Noriega
Elena Fernandez López
Crear una tabla calendario en Power BI es uno de los pasos fundamentales para cualquier modelo de datos serio. Aprenderás a generarla con DAX usando tablas calculadas, columnas descriptivas y una llave de relación que conecta tu dimensión de fechas con la tabla de ventas.
¿Qué es una tabla calculada en Power BI y cuándo conviene usarla?
Una tabla calculada se genera directamente con fórmulas DAX dentro del modelo, sin necesidad de cargar datos desde una fuente externa. Es ideal cuando necesitas una dimensión de fechas o cuando quieres crear una tabla acotada de apoyo.
¿Cuándo usar una tabla calculada? Cuando necesitas una tabla calendario para time intelligence, o como artificio para tablas auxiliares con datos filtrados que no existen en tu origen.
Para empezar, elimina la dimensión calendario que viene cargada del origen (clic derecho, eliminar del modelo) y desde la vista de datos entra a Herramientas de tabla y selecciona Nueva tabla [0:30].
¿Cómo generar la dimensión de fechas con CALENDAR y CALENDARAUTO?
La función CALENDARAUTO detecta automáticamente la fecha mínima y máxima del modelo. El problema es que toma cualquier campo fecha, incluyendo cosas como la fecha de nacimiento de los vendedores, lo que puede arrastrar tu calendario hasta 1985 [1:15].
Por eso conviene usar CALENDAR con un rango explícito:
DAX dim fechas = CALENDAR(DATE(2015,1,1), DATE(2017,12,31))
Esto te entrega una columna Date controlada entre el 1 de enero de 2015 y el 31 de diciembre de 2017 [1:45]. Cambia el tipo de dato de fecha y hora a fecha simple y aplica un formato sencillo para que el modelo quede limpio.
¿Por qué evitar CALENDARAUTO en modelos con fechas de nacimiento?
Porque expande el rango a años irrelevantes y genera ruido en los filtros. CALENDAR con fechas explícitas te da control total sobre el horizonte temporal del análisis.
¿Qué columnas calculadas debe tener una buena tabla de fechas?
Una vez creada la tabla, agrega columnas descriptivas para enriquecer los cortes de análisis. Desde la vista de datos, clic derecho sobre dim fechas y elige Nueva columna para cada una [2:40].
Año = YEAR('dim fechas'[Date]).Mes = FORMAT('dim fechas'[Date], "mmmm") para obtener el nombre del mes en texto.Semana = WEEKNUM('dim fechas'[Date]).NumMes = MONTH('dim fechas'[Date]), clave para ordenar correctamente.Cada una de estas columnas te da un filtro adicional para tus visualizaciones. Y aquí viene lo interesante: el número de mes parece redundante, pero cumple una función crítica de ordenamiento que verás más adelante.
¿Cómo crear la llave date key para relacionar tablas?
Para conectar la dimensión de fechas con tu tabla de hechos (por ejemplo, ventas), necesitas una columna llave con el formato aaaammdd, igual al que ya existe en la tabla fact.
DAX DateKey = VALUE(FORMAT('dim fechas'[Date], "yyyymmdd"))
El FORMAT genera el texto y VALUE lo convierte en número [4:20]. Con esa columna lista, ve a la vista de modelo y arrastra el campo DateKey desde dim fechas hacia la tabla de ventas o presupuestos para crear la relación.
¿Qué es un date key en Power BI? Es una columna numérica con formato
aaaammddque sirve como clave única para relacionar la dimensión de fechas con tablas de hechos como ventas o presupuestos.
¿Cómo ordenar el mes correctamente en visualizaciones?
Si creas un gráfico de columnas agrupadas con ventas por año y mes, vas a notar que los meses aparecen en orden alfabético: abril, agosto, diciembre. Eso rompe cualquier lectura cronológica.
La solución es ordenar el campo Mes por NumMes:
Vuelve a tu visual, ordena el eje de forma ascendente y verás los meses correctamente: enero, febrero, marzo, hasta diciembre, año tras año [6:30].
¿Por qué la tabla calendario es obligatoria en Power BI?
La dimensión de tiempo es un requisito fundamental para usar funciones de time intelligence como TOTALYTD, SAMEPERIODLASTYEAR o DATEADD. Sin ella, esas agregaciones simplemente no funcionan bien.
Además, evita vacíos de información cuando hay días sin ventas, y al sumar columnas descriptivas (año, trimestre, semana, mes) habilita cortes de análisis mucho más ricos sobre tus datos transaccionales.
Reto: genera una columna calculada llamada DiaSemana sobre tu dim fechas que devuelva los valores de lunes a domingo. Pista: combina FORMAT con el patrón "dddd" y luego ordénala con un número de día. ¿Cómo lo resolverías? Compártelo en los comentarios.
Anderson Camilo Rodriguez Salvador
Alexis Aquino Noriega
Elena Fernandez López
Mario Hernán Ayala Allende
Edwin Adrian Borrero Arias
Andres Roa
Federico Acuña
Alex Ivan Mikelsen
Carlos Fabrishio Venegas Arana
Nicolas Leonardo Anicama Espinoza
Heiber Hernán Beltrán Torres
Juan R Rossano
Ana Valentina Villarroel Castañeda
Sergio de Jesús Huesca Nieva
Alejandra Fandiño
Julian Mancera
Alex Xiomar Rubio Lopez
Dorka Gonzalez Tejeda
Jose Salvador Paredes Mora
Irmin Corona 🐯
Luisa Fernanda Carbonell Garcia
Christiam Hernández
Ignacio Andrés Villegas Belmar
Carlos Miguel
Pablo Fernando Ramos Tito
Katherine Granado
David Cano
Diego Mauricio Zuluaga Rodríguez
Juan Felipe Rodriguez Valencia
En caso que aparezcan los dias o los meses en Ingles, podemos añadirle un argumento a la instruccion FORMAT() , donde "es-ES" sera para que el resultado sea en español.
dia_semana = FORMAT(tabla_calendario[date], "DDDD", "es-ES")
Gracias amigo mio, buen aporte
Esta forma es más sencilla que la que conocía yo de otro curso.
Día de semana texto = SWITCH(Calendario[Día de semana #], 1, "Domingo", 2, "Lunes", 3, "Martes", 4, "Miércoles", 5, "Jueves", 6, "Viernes", 7, "Sábado")
Una diferencia es que con la forma de Anderson, empieza por default en domingo. La segunda te permite controlar mejor qué número coincide con qué día de la semana.
Nos recupera el numero del dia de la semana y el valor 1 significa que queremos que empiece de domingo a sabado nuestra numeracion.
Para dar formato a nombre del día
Gracias por el dato
Otra forma de crear las columnas de año y mes es llamando la columna "date" y seleccionando alguna de las opciones que salen posterior al punto (como el .[Año] .[Mes])
Yo use esta opción y me salio ordenado de una! No tuve que aplicar el "orden por mes"
Clase 5. Tablas Calculadas. En Power BI: • Vamos a la sección vista de datos. • Seleccionamos la tabla con la información que requiramos. • Buscamos en la barra superior “Herramientas de Tablas.” • Damos click en la opción “Nueva Tabla”.
Función CALENDARAUTO () Es una agregación de DAX, que permite generar una columna de fecha a partir de la fecha mínima y máxima que encuentre dentro de nuestro modelo de datos. Ejemplo: DIM_FECHAS = CALENDARAUTO (“01/01/2015”, “31/12/2017”)
ORDENAR DATOS DE COLUMNAS. • Seleccionamos la columna dentro de la tabla. • Vamos a “ORDENAR COLUMNA” • Seleccionamos el orden que queremos darle.
¿Cuánto utilizar una tabla calculada? • Usualmente para crear una tabla calendario. • Como artificio para generar una tabla adicional de datos.
Tabla de tiempo. • Requisito para generar TIME INTELLIGENCE. • Evita vacíos de información a nivel de tiempo. • Ventajas de mayor análisis.
Sería interesante tener un curso de Power Query con lenguaje M
lo mismo pido :D
Tabla Calendario Completa = ADDCOLUMNS( CALENDARAUTO(), "Año", YEAR([Date]), "Mes_Num", MONTH([Date]), "Mes", VAR x = FORMAT([Date],"Mmmm") VAR y =UPPER( LEFT(x,1)) VAR z = MID(x,2,LEN(x)) RETURN y & z, "Trimestre", "Q"& QUARTER([Date]), "Semestre",IF(MONTH([Date])<=6,"Sem 1","Sem 2"), "Semana", WEEKNUM([Date],2), "Dia mes",DAY([Date]), "Dia Semana",WEEKDAY([Date],2), "Nombre Día",FORMAT([Date],"Dddd")) ```Tabla Calendario Completa = ADDCOLUMNS(   CALENDARAUTO(),   "Año", YEAR(\[Date]),   "Mes\_Num", MONTH(\[Date]),   "Mes",   VAR x = FORMAT(\[Date],"Mmmm")   VAR y =UPPER( LEFT(x,1))   VAR z = MID(x,2,LEN(x))   RETURN   y & z,   "Trimestre", "Q"& QUARTER(\[Date]),   "Semestre",IF(MONTH(\[Date])<=6,"Sem 1","Sem 2"),   "Semana", WEEKNUM(\[Date],2),   "Dia mes",DAY(\[Date]),   "Dia Semana",WEEKDAY(\[Date],2),   "Nombre Día",FORMAT(\[Date],"Dddd")) // Les dejo una tabla calendario en dax
Para hacerlo mas dinamico al tener la fecha con formato numero cree en la Fact_Ventas la columna fecha con la formula
format(date(int(Fact_Ventas[datekey]/10000),mod(int(Fact_Ventas[datekey]/100),100),mod(Fact_Ventas[datekey],100)))
y la column calendar de la nueva tabla la hice dinamica en base a la fecha minima y maxima con la formula
CALENDAR(min(Fact_Ventas[fecha]),max(Fact_Ventas[fecha]))
Muchas gracias por esta buena idea, Juan! Para mí es vital no solo llegar a un resultado con los datos disponibles del momento sino pensarlo de cara al futuro, procurando la menor cantidad de tiempo y riesgo de error al tener que revisar manualmente las tablas a ver qué rango de fechas debo actualizar.
Noté que a la fórmula de formato que propones le faltó el segundo argumento, yo lo planteé así:
Fecha = format(date(int(Fact_Ventas[datekey]/10000),MOD((Fact_Ventas[datekey]/100),100), mod(Fact_Ventas[datekey],100)), "dd/mm/yyyy")
Recordemos que la idea de las tablas dim es "filtrar" la información de tu tabla fact, por lo cual tu tabla dim_fechas debe estar preparada para las fechas que tu tabla fact tendra.
La idea es buena para garantizar que no tengas huecos, pero no es lo mismo el procesamiento de 1096 filas (numeros de registros ocupados por renzo) que de millones de datos en una tabla fact, por lo cual el buscar el maximo y minimo en millones de registros te va a generar mucho procesamiento cada que este buscando estos datos.
Calculando si es fin de semana o entre semana
Cálculo día de la semana en texto usando fórmula DAX:
Dia_Semana = FORMAT([Date],"dddd")
Hola!!!
Día de la semana = FORMAT(dim_fechas[Date],"dddd")
Agregue la columna con numero de dia y nombre de dia de la semana
Recuerden que deben agregar el 2 al final de la variable para que traiga los días de la semana, empezando el lunes como día 1. Por ejemplo: Lunes = 1, Martes = 2, Miércoles = 3.
Day number = WEEKDAY(Dim_Fechas[Date],2)
Muchas gracias
Que objetivo cumple la función "Value" que se agrega al comienzo?
La función VALUE transforma el texto que devuelve la función FORMAT (como "20150101") en un número entero.
Power BI necesita que las columnas que actúan como llaves compartan exactamente el mismo tipo de datos para relacionar la dimensión de fechas con la tabla de hechos.
¿Ves por qué necesitamos un número en lugar de texto para esa relación?
Las llaves de las tablas deberían definirse como tipo texto, ya que no se utilizan en operaciones matemáticas. Además, si una llave es, por ejemplo, 0001423, al tratarla como número se interpretaría como 1423, perdiendo los ceros iniciales. Esto puede ocasionar que la clave deje de coincidir con la del sistema origen, rompiendo relaciones entre tablas o generando inconsistencias en el modelo.
Por eso, si en la tabla Fact_Ventas se cambia el tipo de dato a texto, la columna calculada puede escribirse simplemente como: Datekey = FORMAT(Dim_Fechas[Date], "yyyymmdd")
Entiendo que el propósito del curso es mostrar las funciones DAX y no la transformación de tipos de datos, pero es importante tenerlo en cuenta.
Comparto mi reto!
Esta fue mi forma que es mas sencilla:
Dia Semana = FORMAT(Dim_Fechas[Date], "dddd")
La forma con Switch para mi es más extenso. La idea es ser sencillo y simple en lo que se necesita.
¿Por qué es mejor usar la función CALENDAR?
La función CALENDARAUTO escanea automáticamente todo tu modelo de datos buscando la fecha más antigua y la más reciente. Si tienes una tabla de empleados con fechas de nacimiento de 1950, tu calendario iniciará en ese año, generando miles de filas innecesarias que consumen memoria. Por el contrario, la función CALENDAR te permite establecer límites exactos y controlados, por ejemplo, desde el 1 de enero de 2015 hasta el 31 de diciembre de 2017. Piensa en CALENDARAUTO como invitar a toda la ciudad a una fiesta solo porque viven allí, mientras que CALENDAR es enviar invitaciones VIP exclusivamente a las personas que realmente quieres que asistan, es decir, las fechas de tus transacciones. Esto mantiene tu modelo de Power BI ligero, optimizado y enfocado únicamente en el rango de tiempo que aporta valor a tu análisis de negocio.
Para calcular el día de la semana podemos usar la función weekday de la siguiente manera:
Dia Semana = WEEKDAY(Dim_Fechas[Date],1)
De esta manera el Domingo será 1, lunes 2 y asi sucesivamente.
y ya para anexar la columna de Dia texto:
Dia Texto = FORMAT(WEEKDAY(Dim_Fechas[Date],1),"dddd")