Medidas semi-aditivas en DAX

En cualquier sistema de BI, podemos crear cálculos o medidas de 3 tipos distintos:

  • Medidas aditivas: son generalmente la mayor parte de las medidas que nos encontraremos en un modelo de datos analítico, y se caracterizan porque podemos usar la función SUM() para agregar sus valores en función de cualquier atributo dimensional. Un ejemplo típico pueden ser las ventas, cuyo total podemos desglosar en la suma de las ventas por producto, por mes, por cliente, así como por cualquier otro atributo que nos interese para filtrar o segmentar dicho cálculo.
  • Medidas semi-aditivas: son las más complejas y en las que vamos a profundizar en este artículo. Este tipo de cálculos pueden usar la función SUM() para agregar sus valores solo en función de determinadas dimensiones, pero se necesita otro tipo de agregación distinta para segmentar por los atributos de alguna otra dimensión. Ejemplos típicos de este tipo de medidas son las tablas de inventarios y las de los saldos de las cuentas contables, que no pueden agregarse en función de los atributos de la dimensión temporal mediante una suma simple.
  • Medidas no aditivas: son aquellas que no pueden agregarse usando la función SUM() en función de ninguno de los atributos presentes en el modelo de datos. Un ejemplo típico es el tipo de cambio de una moneda respecto a otra.

Las medidas semi-aditivas se generan en la mayoría de los casos sobre tablas de copia instantanea de volumen o snapshots. Este tipo de tablas constituyen tablas de hechos, ya que se relacionan con distintas dimensiones y se usan para el cálculo de indicadores económico-financieros y operativos, pero no registran eventos que han ocurrido en un momento determinado, si no que guardan los valores medidos en un momento u horizonte temporal.

Podemos distinguir dos tipos distintos de snapshots, aquellos que podríamos denominar naturales, como el registro de la temperatura media diaria, y los snapshots derivados, que son aquellos que se originan a partir de un proceso de transacciones tras la realización de alguna agregación previa. Este tipo de tablas las encontraremos en un modelo de datos, la mayoría de los veces, porque el nivel de granularidad mínimo es inaccesible o el volumen de datos necesario sería extremandamente grande. El ejemplo que usaremos en este artículo son las tablas que registran los saldos de las subcuentas contables:

Image 1

Como podemos observar, estas tablas de saldos mensuales son snapshots derivados, ya que el saldo de cada cuenta puede obtenerse mediante la suma de todos los movimientos contables ocurridos para cada una de ellas durante el horizonte temporal deseado, en este caso el mes.

En el caso de que tengamos que trabajar con una tabla de este tipo, las medidas generadas serán semi-aditivas, por lo que las agregaciones con la función SUM() no serán correctas en los totales cuando utilicemos algún atributo temporal para segmentar o filtrar el cálculo. Lo que necesitamos es acceder al saldo correspondiente a la última fecha del contexto de filtro actual, para que obtengamos siempre el saldo correcto en cada periodo, lo que podemos realizar con el siguiente código:

Saldos :=
CALCULATE (
    SUM ( SaldosContablesMensuales[Saldo] );
    LASTDATE ( CALCULATETABLE ( VALUES ( SaldosContablesMensuales[Fecha] ) ) )
)

Todo el código DAX de este artículo ha sido formateado con «DAX Formatter»
DAX Formatter by SQLBI

Deja un comentario