En primer lugar quiero aclarar que los tipos de datos DAX no son algo exclusivo de Power BI. Dado que el lenguaje DAX es común para los modelos de datos (data models) de Power BI, para Power Pivot para Excel y para SSAS Tabular. Por ello todo lo explicado aquí es aplicable a los tres productos, ya que estos comparten el mismo motor de almacenamiento: Vertipaq.
Vamos a clasificarlos en diversos grupos con características en común para facilitar su comprensión:
Tipos de datos DAX: Numéricos
Todos ellos tienen en común que su almacenamiento ocupa 8 bytes.
- Número Decimal (Decimal Number): son números de punto flotante. Puede almacenar valores de hasta 15 dígitos, positivos y negativos, en los que el separador decimal puede colocarse en cualquier parte del número
- Número Decimal Fijo (Fixed Decimal Number): el separador decimal tiene una ubicación fija. Puede almacenar valores de hasta 19 dígitos, almacenando «siempre» 4 decimales
- Número Entero (Whole Number): Permite hasta 19 dígitos en la parte entera, pero no admite decimales
Está claro que en el caso de no tener que almacenar decimales utilizaremos el tipo Entero (Whole Number). Ahora, donde debemos evaluar con detalle el tipo de datos a utilizar es cuando tenemos que almacenar decimales y no dejarnos llevar por los asistentes y los valores que se asignan por defecto al importar datos desde el origen porque nos pueden causar problemas. Siempre debemos realizar una revisión exhaustiva del tipo de datos asignado a cada columna de todas las tablas de nuestro modelo de datos (data model).
Siempre que estemos almacenando valores de transacciones financieras y de gestión que necesiten almacenar números con decimales, la mejor opción es Número Decimal Fijo (Whole Number), cuya única excepción es que necesitemos almacenar más de 4 decimales, en cuyo caso no nos queda otra alternativa que utilizar Número Decimal.
Y ¿Por qué esta decisión? Porque al trabajar datos almacenados con punto flotante, se pueden producir pequeñas variaciones en los cálculos debido a la precisión, que si bien para unas decenas de filas las consecuencias son inapreciables, lo habitual es que tengamos miles o millones de filas, con lo que cuando utilizamos funciones de agregación (algo que ocurre en la práctica totalidad de nuestros modelos de datos), se van produciendo esas variaciones, esos descuadres que no nos podemos permitir a la hora de presentar resultados y que, en este caso, no son debidos al error en las fórmulas DAX, sino al error cometido por no asignar el tipo de datos adecuado a las columnas que intervienen en los cálculos.
En resumen, basándonos en lo anterior, esta es mi recomendación en cuanto a los tipos de datos numéricos a utilizar en las columnas de las tablas del modelo:
- Si no hay decimales -> Número Entero (Whole Number)
- Si hay hasta 4 decimales -> Número Decimal Fijo (Fixed Decimal Number). Para gran parte de las transacciones financieras es suficiente con 2 decimales, así que no será habitual que se produzca un overflow por usar este tipo de datos habitualmente.
- Si hay 5 decimales o más -> Número Decimal (Decimal Number). No es que nos parezca la opción más adecuada, pero al no disponer de un tipo de datos que sin usar punto flotante nos permita almacenar más de 4 decimales, es la única alternativa viable.
Finalmente os dejo este enlace a un artículo en inglés que aborda este tema en más profundidad: Choosing Numeric Data Types in DAX.
Tipos de datos DAX: Fecha y Hora
Un detalle importante que debes tener en cuenta es, que aunque no es visible, internamente se almacenan como un tipo de número decimal, que almacena la diferencia de tiempo entre la fecha indicada y al 1/1/1900. Almacena la fecha en la parte entera del número interno y la hora en la parte decimal.
Disponemos de tres tipos de datos para almacenar fechas y horas:
- Fecha/Hora (Date/Time): almacena valores de fechas y horas
- Fecha (Date): almacena sólo la parte de la fecha, siendo siempre ceros los valores de la hora (parte decimal)
- Hora (Time): almacena sólo la parte de la hora, siendo siempre ceros la pare de la fecha (parte entera, que por tanto equivale a 1/1/1900)
Por supuesto, no es necesario conocer estos detalles de almacenamiento numérico que te he comentado, pero en un momento dado, si algo no está dando el resultado que esperas, el entender estos detalles internos te puede ser de mucha ayuda para solucionar problemas concretos.
Otros tipos de datos DAX (Texto, Booleano, Binario)
Para almacenar valores de texto, disponemos de un único tipo de datos: Texto (Text). Almacena cadenas de caracteres Unicode de hasta 512 MB. Por tanto, sin entrar a más detalles técnicos, se pueden almacenar cadenas de caracteres muuuuuuy largas :), de hasta 256 millones de caracteres Unicode. No distingue entre mayúsculas y minúsculas (case-insensitive), es decir, hola = Hola = HOLA.
Disponemos también de un tipo de datos Booleano llamado Verdadero/Falso (True/False), que admite únicamente esos dos valores, almacenándose internamente el valor ‘falso’ con un 0 (cero) y el valor ‘verdadero’ con un 1.
Finalmente, disponemos del tipo Binario (Binary), que nos permite almacenar diversos objetos y se utiliza principalmente para almacenar fotos. Pensarás ¿Y para que quiero una foto en un modelo analítico? Pues principalmente para mejorar la interfaz de usuario y la usabilidad. Puedes utilizarlo, por ejemplo, para filtrar en base a la foto en lugar de una descripción o para mostrar dichas fotos en un informe o cuadro de mando.
Te dejo un enlace a la web oficial de Power BI donde puedes ampliar información: Tipos de datos en Power BI Desktop.
Tipos de datos DAX y Relaciones entre tablas
Es muy importante entender todas las características y comportamientos de cada uno de los tipos de datos DAX, ya que además de aplicar el tipo de datos idóneo a cada columna y evitar posibles problemas citados anteriormente, es necesario que para establecer una relación entre dos tabla, las columnas que intervienen en dicha relación han de ser del mismo tipo de datos.
Tipos de datos y formato
Los tipos de datos afectan al almacenamiento interno y al resultado de los cálculos. Es fundamental, como hemos comentado, utilizar los tipos de datos adecuados para obtener los resultados deseados y correctos. El formato afecta a la visualización exclusivamente.
Es muy importante también utilizar el formato adecuado, que además sea coherente con el tipo de datos utilizado y el número de decimales obtenidos en los cálculos. Por ejemplo, si utilizado el tipo de datos entero, no tiene sentido que pongamos 4 decimales en el formato. El que no tenga sentido no quiere decir que no se pueda hacer, evidentemente, sí que se puede, lo que ocurrirá es que en la parte decimal, siempre aparecerán cinco ceros.
Si por el contrario, ponemos un formato con menos decimales de los que almacena ese tipo de datos ocurrirá que sólo se mostrarán esos, realizando un redondeo implícito. Por ejemplo, si tenemos una columna que tiene números enteros fijos y un formato de dos decimales, hará un redondeo implícito. Aunque en este caso es recomendable hacer en el momento de la carga un redondeo explícito mediante las funciones de cálculo de Query y almacenarlo ya redondeado a dos decimales.
Conclusiones
Espero que a partir de este momento des toda la importancia que tiene al uso de los tipos de datos adecuados, a los cálculos con redondeos explícitos en el proceso extracción, transformación y carga de los datos de origen al modelo, y que evites esos tan indeseados «descuadres» en tus resultados analíticos ????
Si quieres profundizar en este y otros muchos aspectos fundamentales de Power BI, de la analítica de datos, aplicando métodos adecuados y buenas prácticas, te recomiendo leer detenidamente…