AVERAGEX con CALCULATE como medida rápida, ¿por qué?

Un usuario Pregunto ✅

Anónimo

Hola amigos,

Acabo de usar una Medida Rápida (¡¡¡opción IMPRESIONANTE !!!) para calcular la Medida Promedio por Categoría.

El DAX que se generó fue:

Promedio de AMT por departamento =
AVERAGEX (KEEPFILTERS (VALUES (‘Hecho'[Dept])), CALCULATE (SUM (‘Hecho'[AMT])))

Funciona bien, pero no entiendo por qué usa CALCULATE dentro de AVERAGEX

Si omito CALCULAR:

AVERAGEX (KEEPFILTERS (VALUES (‘Hecho'[Dept])), SUM (‘Hecho'[AMT]))

Recibo una respuesta incorrecta, pero ¿POR QUÉ?

Si tiene un enlace o una explicación, ¡se lo agradeceré!

¡Gracias!

Miguel

OwenAuger

Hola @Anónimo

CALCULATE es necesario siempre que desee convertir un contexto de fila en un contexto de filtro equivalente (transición de contexto).

En su caso, AVERAGEX itera sobre las filas de VALORES (‘Hecho'[Dept]), creando un contexto de fila para cada fila y evalúa el segundo argumento en cada contexto de fila por turno.

Sin CALCULAR, la expresión SUM (‘Hecho'[AMT]) tendría el mismo valor para cada fila, siendo la suma evaluada en el contexto de filtro original. Una expresión agregada como SUM (‘Fact'[AMT]) se calcula en el contexto de filtro actual, que no se ve afectado por el contexto de la fila.

Con CALCULATE, el contexto de la fila, que en este caso corresponde a un valor particular de ‘Hecho'[Dept], se convierte en un filtro y se agrega al contexto del filtro, por lo que SUM (‘Fact'[AMT]) se evalúa en ese contexto de filtro modificado, es decir, la suma ahora se filtra a un departamento en particular.

Sugeriría obtener una copia de The Definitive Guide to DAX, o leer estos artículos (u otros sobre el mismo tema):

  • https://www.sqlbi.com/articles/understanding-context-transition/
  • https://www.sqlbi.com/articles/row-context-and-filter-context-in-dax/
  • http://tinylizard.com/converting-row-context-into-filter-context/

(He ignorado la parte KEEPFILTERS de la expresión por cierto)

Saludos

Owen 🙂

OwenAuger

Hola @Anónimo

CALCULATE es necesario siempre que desee convertir un contexto de fila en un contexto de filtro equivalente (transición de contexto).

En su caso, AVERAGEX itera sobre las filas de VALORES (‘Hecho'[Dept]), creando un contexto de fila para cada fila y evalúa el segundo argumento en cada contexto de fila por turno.

Sin CALCULAR, la expresión SUM (‘Hecho'[AMT]) tendría el mismo valor para cada fila, siendo la suma evaluada en el contexto de filtro original. Una expresión agregada como SUM (‘Fact'[AMT]) se calcula en el contexto de filtro actual, que no se ve afectado por el contexto de la fila.

Con CALCULATE, el contexto de la fila, que en este caso corresponde a un valor particular de ‘Hecho'[Dept], se convierte en un filtro y se agrega al contexto del filtro, por lo que SUM (‘Fact'[AMT]) se evalúa en ese contexto de filtro modificado, es decir, la suma ahora se filtra a un departamento en particular.

Sugeriría obtener una copia de The Definitive Guide to DAX, o leer estos artículos (u otros sobre el mismo tema):

  • https://www.sqlbi.com/articles/understanding-context-transition/
  • https://www.sqlbi.com/articles/row-context-and-filter-context-in-dax/
  • http://tinylizard.com/converting-row-context-into-filter-context/

(He ignorado la parte KEEPFILTERS de la expresión por cierto)

Saludos

Owen 🙂

Anónimo

En respuesta a OwenAuger

¡Gracias por la explicación detallada Owen!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *