Está en la página 1de 7

23/08/2023, 15:56 Argumentos de filtro en CALCULATE - SQLBI

Argumentos de filtro en CALCULATE


sqlbi.com/articles/filter-arguments-in-calculate

Marco Russo

NOTE: This article is about table filter arguments, and does not consider directive
arguments (such as ALL, USERELATIONSHIP, CROSSFILTER, …) that alter the filter
context without applying a list of values as a new filter.

UPDATE 2017-01-30 : Excel 2016, Power BI, and SSAS Tabular 2016 now have
SUMMARIZECOLUMNS, which should replace the use of SUMMARIZE described in this
article for DAX queries, but it cannot replace it in measures. Read more in Introducing
SUMMARIZECOLUMNS.

https://www.sqlbi.com/articles/filter-arguments-in-calculate/ 1/7
23/08/2023, 15:56 Argumentos de filtro en CALCULATE - SQLBI

CALCULATE Filters Fundamentals


When you write a CALCULATE statement, all the filter arguments are table expressions,
such as a list of values for one or more columns, or for an entire table. For example,
when you write:

1 CALCULATE (
2 <expression>,
3 table[column] = <value>
4 )

Copy Conventions#1
In reality the filter expression you wrote is transformed in:

1 CALCULATE (
2 <expression>,
3 FILTER (
4 ALL ( table[column] ),
5 table[column] = <value>
6 )
7 )

Copy Conventions#2
Este comportamiento es idéntico para todos los argumentos de filtro de CÁLCULO y
CALCULATETABLE. A partir de ahora, describiremos la sintaxis de los argumentos del
filtro en estas funciones, identificados por en la sintaxis general:

CALCULATE (
<scalar expression>,
<filter1>,
<filter2>,
...,
<filterN>
)
CALCULATETABLE (
<table expression>,
<filter1>,
<filter2>,
...,
<filterN>
)

Copiar Convenios#3
Una función de filtro puede ser una expresión lógica o una expresión de tabla:

https://www.sqlbi.com/articles/filter-arguments-in-calculate/ 2/7
23/08/2023, 15:56 Argumentos de filtro en CALCULATE - SQLBI

table[column] = <value>
FILTER ( ... )
ALL ( ... )

Copiar Convenios#4
Donde ... se permite cualquier otra expresión de tabla en un argumento de filtro.

Argumentos de filtro complejos


La sintaxis DAX de la automática FILTRO La función generada por DAX en lugar de una
expresión lógica requiere que exprese una sola columna en la expresión del filtro. Por
esta razón, puedes escribir:

1 [Sales Red or Blue] :=


2 CALCULATE (
3 [Sales Amount],
4 Product[Color] = "Red" || Product[Color] = "Blue"
5 )

Copiar Convenios#5
La sintaxis anterior se transforma internamente en la siguiente, que puede escribir de
manera explícita obteniendo el mismo comportamiento de su medida DAX.

1 [Sales Red or Blue] :=


2 CALCULATE (
3 [Sales Amount],
4 FILTER (
5 ALL ( Product[Color] ),
6 Product[Color] = "Red" || Product[Color] = "Blue"
7 )
8 )

Copiar Convenios#6
Sin embargo, no puede escribir un solo argumento de filtro que haga referencia a dos
columnas diferentes

1 [Sales Red or Contoso - invalid] :=


2 CALCULATE (
3 [Sales Amount],
4 'Product'[Color] = "Red" || 'Product'[Brand] = "Contoso"
5 )

Copiar Convenios#7

https://www.sqlbi.com/articles/filter-arguments-in-calculate/ 3/7
23/08/2023, 15:56 Argumentos de filtro en CALCULATE - SQLBI

En este caso, debe escribir una expresión de tabla explícita en lugar de confiar en la
conversión automática de una expresión lógica en una expresión de tabla hecha por
CÁLCULO y CALCULATETABLE cuando haces referencia a una sola columna. Tiene
varias opciones disponibles, produciendo resultados diferentes y potencialmente con un
rendimiento diferente. Leer más en Especificar múltiples condiciones de filtro en
CÁLCULO artículo.

Filtro de mesa
Puede escribir un filtro sobre dos columnas usando un filtro sobre toda la tabla que
contiene ambas columnas.

1 [Sales Red or Contoso - table filter] :=


2 CALCULATE (
3 [Sales Amount],
4 FILTER (
5 'Product',
6 'Product'[Color] = "Red" || 'Product'[Brand] = "Contoso"
7 )
8 )

Copiar Convenios#8
Usando un filtro de tabla, hereda el argumento de filtro existente para la tabla de
Producto, por lo tanto, no incluirá un producto Rojo o de la marca Contoso si no estaba
presente en el filtro existente. Lo que es más importante, no anulará el filtro existente en
dicha columna. Por lo tanto, si tiene una rebanadora que filtra la marca Proseware, verá
el monto de las ventas de solo los productos Red que pertenecen a la marca Proseware,
ignorando cualquier producto de la marca Contoso.

TODO Filtro de columnas


Puede escribir un filtro sobre dos columnas creando una tabla especial que tenga solo
las columnas que necesita. Al usar el TODO función, obtiene una tabla con todas las
combinaciones únicas de valores existentes en la tabla subyacente para las columnas
referenciadas.

1 [Sales Red or Contoso - ALL columns filter] :=


2 CALCULATE (
3 [Sales Amount],
4 FILTER (
5 ALL ( 'Product'[Color], 'Product'[Brand] ),
6 'Product'[Color] = "Red" || 'Product'[Brand] = "Contoso"
7 )
8 )

https://www.sqlbi.com/articles/filter-arguments-in-calculate/ 4/7
23/08/2023, 15:56 Argumentos de filtro en CALCULATE - SQLBI

Copiar Convenios#9
En este caso, la cardinalidad del filtro puede ser menor que el producto cartesiano de los
valores que tiene en las columnas referenciadas. Para obtener dicha lista, el motor debe
ejecutar un escaneo de tabla. Esto podría ser costoso para columnas de baja
cardinalidad en una tabla grande.

El resultado de este filtro anulará cualquier filtro existente sobre las columnas
especificadas. Por ejemplo, si tiene una rebanadora que filtra la marca Proseware, verá
el monto de las ventas de los productos Red independientemente de la marca, sumado a
las ventas de toda la marca Contoso, independientemente del color –, pero los productos
de color rojo y la marca Contoso se sumarán solo una vez, sin duplicar su valor.

CROSSJOIN Filtro de columnas


Un enfoque alternativo a la TODO el filtro descrito en la sección anterior está utilizando
un CROSSJOIN sobre todos los valores de las dos columnas. Usando CROSSJOIN,
obtiene toda la combinación posible de los valores que tiene en las columnas a las que
se hace referencia, independientemente del hecho de que la combinación existe en la
tabla subyacente.

1 [Sales Red or Contoso - CROSSJOIN columns filter] :=


2 CALCULATE (
3 [Sales Amount],
4 FILTER (
5 CROSSJOIN (
6 ALL ( 'Product'[Color] ),
7 ALL ( 'Product'[Brand] )
8 ),
9 'Product'[Color] = "Red" || 'Product'[Brand] = "Contoso"
10 )
11 )

Copiar Convenios#10
En este caso, la cardinalidad del filtro es idéntica al producto cartesiano de los valores
que tiene en las columnas referenciadas. Para obtener dicha lista, el motor no realiza un
escaneo de tabla, sino que solo utiliza la lista de valores disponibles en las dos
columnas. Esto podría ser costoso para columnas de alta cardinalidad que tienen una
alta correlación, de modo que el número de combinaciones existentes en la tabla es
mucho menor que todas las combinaciones posibles.

El resultado de este filtro es idéntico al TODO filtro de columnas, puede observar un


rendimiento diferente en los dos enfoques. El mejor depende de la cardinalidad de la
tabla y de las columnas involucradas en el filtro. Sin embargo, puedes usar CROSSJOIN

https://www.sqlbi.com/articles/filter-arguments-in-calculate/ 5/7
23/08/2023, 15:56 Argumentos de filtro en CALCULATE - SQLBI

para combinar columnas de diferentes tablas, lo cual no es posible usando el TODO


sintaxis.

RESUMEN Filtro de columnas


Si no desea el comportamiento de reemplazo de filtro que tiene usando TODO y
CROSSJOIN, pero desea mantener el filtro existente como lo ha hecho utilizando el filtro
de tabla, puede usar MANTENER FILTROS envolviendo el filtro ALL / CROSSJOIN, o
puede usar RESUMEN. Esta es la sintaxis que usa MANTENER FILTROS:

1 [Sales Red or Contoso - ALL KEEPFILTERS] :=


2 CALCULATE (
3 [Sales Amount],
4 KEEPFILTERS (
5 FILTER (
6 ALL ( 'Product'[Color], 'Product'[Brand] ),
7 'Product'[Color] = "Red" || 'Product'[Brand] = "Contoso"
8 )
9 )
10 )

Copiar Convenios#11

1 [Sales Red or Contoso - CROSSJOIN KEEPFILTERS] :=


2 CALCULATE (
3 [Sales Amount],
4 KEEPFILTERS (
5 FILTER (
6 CROSSJOIN (
7 ALL ( 'Product'[Color] ),
8 ALL ( 'Product'[Brand] )
9 ),
10 'Product'[Color] = "Red" || 'Product'[Brand] = "Contoso"
11 )
12 )
13 )

Copiar Convenios#12
los RESUMEN La función genera una lista de las combinaciones existentes entre dos o
más columnas, y se puede usar con columnas que pertenecen a diferentes tablas si
están conectadas en una cadena de relaciones de muchos a uno.

https://www.sqlbi.com/articles/filter-arguments-in-calculate/ 6/7
23/08/2023, 15:56 Argumentos de filtro en CALCULATE - SQLBI

1 [Sales Red or Contoso - SUMMARIZE filter] :=


2 CALCULATE (
3 [Sales Amount],
4 FILTER (
5 SUMMARIZE (
6 'Product',
7 'Product'[Color],
8 'Product'[Brand]
9 ),
10 'Product'[Color] = "Red" || 'Product'[Brand] = "Contoso"
11 )
12 )

Copiar Convenios#13
En este caso, la cardinalidad del filtro se reduce en comparación con ALL / CROSSJOIN,
pero usted paga el costo de un escaneo de tabla para obtener las combinaciones
existentes de las columnas especificadas en RESUMEN. Esto podría ser costoso para
columnas de baja cardinalidad en una tabla grande. Podría ser potencialmente más
rápido que el escaneo de la tabla para una condición de filtro compleja, pero en términos
de rendimiento debe considerar si es alternativo MANTENER FILTROS la sintaxis podría
ser mejor, dependiendo de la distribución de datos.

Conclusiones
Tiene varias opciones para especificar un filtro complejo en un CÁLCULO declaración. El
resultado de un argumento de filtro es siempre una tabla con una o más columnas, y el
costo “ ” del filtro es el número de filas que tiene en dicha tabla. La tabla de filtros suele
ser la forma “ fácil ” de escribir una expresión de filtro compleja válida, pero podría tener
una gran gran granularidad para el FILTRO iterador y un mayor costo para el filtro en sí
CÁLCULO, considerando el costo relacionado de una tabla ampliada en un argumento
de filtro.

Puede encontrar más detalles sobre el comportamiento interno y el rendimiento


relacionado en La guía definitiva de DAX. Para una comprensión completa de las
diferencias entre un filtro de tabla y un filtro de columna en CÁLCULO y sus
implicaciones, sugerimos leer el Capítulo 10, Contexto de evaluación avanzada.

Para practicar con las diferentes sintaxis, puede descargar un libro de Excel con las
medidas descritas en este artículo aplicadas a una tabla de pivote con diferentes filtros y
rebanadores, comparando los diferentes resultados. Puede apreciar un rendimiento
diferente solo en modelos de datos más grandes.

https://www.sqlbi.com/articles/filter-arguments-in-calculate/ 7/7

También podría gustarte