Continuando con el modelo de datos de los posts anteriores, explicaremos una función LOOKUPVALUE alternativa al uso de 'CROSSFILTER'.
Ver post anterior aquí.
Nuestro modelo de datos sigue siendo:
La función CROSSFILTER redefine el sentido de una relación ya existente, por lo que obviamente exige como requisito esa existencia... pues la función de hoy LOOKUPVALUE no requiere de relaciones existentes :O
LOOKUPVALUE( result_columnName; search_columnName; search_value[; search_columnName; search_value]…[; alternateResult])
siendo
result_columnName: Nombre de una columna existente que contiene el valor que se quiere devolver. Se debe asignar un nombre a la columna mediante la sintaxis DAX estándar, normalmente, completa. No puede ser una expresión.
search_columnName: Nombre de una columna existente, en la misma tabla que result_columnName o en una tabla relacionada, en la que se realiza la búsqueda. Se debe asignar un nombre a la columna mediante la sintaxis DAX estándar, normalmente, completa. No puede ser una expresión.
search_value: Expresión escalar que no hace referencia a ninguna columna de la misma tabla en la que se busca.
alternateResult(Opcional): Valor devuelto cuando el contexto de result_columnName se ha filtrado a cero o a más de un valor distinto. Cuando no se proporciona, la función devuelve BLANK() si result_columnName se filtra a cero o a un error cuando hay más de un valor distinto.
Algunos apuntes...
El valor de result_column en la fila donde todos los pares de search_column y search_value tienen una coincidencia.
Si no hay ninguna coincidencia que cumpla todos los valores de búsqueda, se devuelve BLANK o alternateResult, si se proporciona. En otras palabras, la función no devolverá un valor de búsqueda si solo coinciden algunos de los criterios.
Si varias filas coinciden con los valores de búsqueda y en todos los casos los valores de result_column son idénticos, se devuelve ese valor. Pero si result_column devuelve valores distintos, se devuelve un error o alternateResult, si se proporciona.
Detallados los aspectos teóricos de la función, veamos un ejemplo.
Definimos una primera medida:
Pz_Coste_medio:=AVERAGEX(TblVentas;LOOKUPVALUE(TblPdtoPrecio[Precio unitario coste];TblPdtoPrecio[Id Pdto];TblVentas[Producto ID]))
donde usamos LOOKUPVALUE para recuperar el 'Precio unitario coste' de la tabla T'blPdtoPrecio' cuando coincida el Id Pdto de esa tabla con el Producto ID de la TblVentas!.
Así evitamos el uso de CROSSFILTER para aquellos casos en lo que no existiera relación creada!... increíble, verdad?.
En segunda instancia aplicamos el ya conocido CROSSFILTER en la medida siguiente
PCosteMedio_CROSS:=CALCULATE([Pz_Coste_medio];CROSSFILTER(TblDirector[Cod país];TblPais[Cod país];Both))
Al generar nuestro informe de tabla dinámica, como en las entradas previas publicadas, observamos idéntico resultado al ejemplo de doble CROSSFILTER
Sin duda una buena opción LOOKUPVALUE a tener presente ;-)
Ver post anterior aquí.
Nuestro modelo de datos sigue siendo:
La función CROSSFILTER redefine el sentido de una relación ya existente, por lo que obviamente exige como requisito esa existencia... pues la función de hoy LOOKUPVALUE no requiere de relaciones existentes :O
LOOKUPVALUE( result_columnName; search_columnName; search_value[; search_columnName; search_value]…[; alternateResult])
siendo
result_columnName: Nombre de una columna existente que contiene el valor que se quiere devolver. Se debe asignar un nombre a la columna mediante la sintaxis DAX estándar, normalmente, completa. No puede ser una expresión.
search_columnName: Nombre de una columna existente, en la misma tabla que result_columnName o en una tabla relacionada, en la que se realiza la búsqueda. Se debe asignar un nombre a la columna mediante la sintaxis DAX estándar, normalmente, completa. No puede ser una expresión.
search_value: Expresión escalar que no hace referencia a ninguna columna de la misma tabla en la que se busca.
alternateResult(Opcional): Valor devuelto cuando el contexto de result_columnName se ha filtrado a cero o a más de un valor distinto. Cuando no se proporciona, la función devuelve BLANK() si result_columnName se filtra a cero o a un error cuando hay más de un valor distinto.
Algunos apuntes...
El valor de result_column en la fila donde todos los pares de search_column y search_value tienen una coincidencia.
Si no hay ninguna coincidencia que cumpla todos los valores de búsqueda, se devuelve BLANK o alternateResult, si se proporciona. En otras palabras, la función no devolverá un valor de búsqueda si solo coinciden algunos de los criterios.
Si varias filas coinciden con los valores de búsqueda y en todos los casos los valores de result_column son idénticos, se devuelve ese valor. Pero si result_column devuelve valores distintos, se devuelve un error o alternateResult, si se proporciona.
Detallados los aspectos teóricos de la función, veamos un ejemplo.
Definimos una primera medida:
Pz_Coste_medio:=AVERAGEX(TblVentas;LOOKUPVALUE(TblPdtoPrecio[Precio unitario coste];TblPdtoPrecio[Id Pdto];TblVentas[Producto ID]))
donde usamos LOOKUPVALUE para recuperar el 'Precio unitario coste' de la tabla T'blPdtoPrecio' cuando coincida el Id Pdto de esa tabla con el Producto ID de la TblVentas!.
Así evitamos el uso de CROSSFILTER para aquellos casos en lo que no existiera relación creada!... increíble, verdad?.
En segunda instancia aplicamos el ya conocido CROSSFILTER en la medida siguiente
PCosteMedio_CROSS:=CALCULATE([Pz_Coste_medio];CROSSFILTER(TblDirector[Cod país];TblPais[Cod país];Both))
Al generar nuestro informe de tabla dinámica, como en las entradas previas publicadas, observamos idéntico resultado al ejemplo de doble CROSSFILTER
Sin duda una buena opción LOOKUPVALUE a tener presente ;-)
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.