Simular un lookupvalue cuando el resultado es más de un valor.

Simular un lookupvalue cuando el resultado es más de un valor.

Ante una consulta como siempre en el grupo de Telegram que me pareció bastante atractiva de resolver, estas fueron mis conclusiones sobre la simulación de un LOOKUPVALUE que pueda devolver más de un elemento.

Dice la documentación oficial de LOOKUPVALUE() lo siguiente:

“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”

Visto de modo práctico:

Tenemos la siguiente tabla ORIGEN:

Y la siguiente de DESTINO donde queremos usar LOOKUPVALUE para traernos los nombres.

Si creamos una columna calculada en el destino nos ocurre esto:

Nos devuelve un error debido a que el resultado en alguno de los campos es más de un valor.

Modos de solucionarlo:

1º Proponiendo que nos devuelva un resultado alternativo cuando haya error para saltárselo:

Si añadimos “Varios” como resultado alternativo va a mostrarnos Varios en aquellos campos donde el resultado es más de uno.

2º vamos a hacer un poco de Magia con DAX y vamos a simular un LOOKUPVALUE en una columna calculada, pero para que nos devuelva el resultado de todos los elementos concatenados en caso de que haya más de un valor:

Tenemos que crear una tabla virtual con los valores que corresponden para cada tipo que introducimos en una variable

    VAR __TablaValores = CALCULATETABLE( VALUES(LookupValue_Origen[Nombre]) ,

                                TREATAS({Lookupvalue_Destino[Tipo]}, LookupValue_Origen[Tipo])

                                        )

Y devolvemos la concatenación de los elementos de cada tabla:

    RETURN

    CONCATENATEX(__TablaValores,LookupValue_Origen[Nombre], «, «)  

Como lo estamos haciendo en una columna calculada, a nivel de cada línea, va a analizar el tipo de cada una de las líneas y lo va a relacionar gracias a la función TREATAS con todos los valores devueltos para ese tipo que vamos a concatenar con la función CONCATENATEX

Podemos incluso controlar el número de valores que queremos mostrar utilizando la función TOPN. Imaginad que queremos que nos muestre sólo los dos primeros valores y el número de valores que contiene, pues simplemente arreglamos nuestra fórmula de esta manera:

Siempre hay que tener en cuenta en este tipo de columnas su performance, puede no ser óptimo su rendimiento con un número elevado de filas, hay que tener en cuenta que estamos usando dos prácticas poco recomendadas:

1º El uso de columnas calculadas.

2º El uso de relaciones débiles con la función TREATAS

FranM

4 comentarios

jose Publicado el1:06 pm - 07/10/2020

Excelente solución, gracias Fran

Alejandro Karcz Publicado el12:38 pm - 25/07/2021

Buen día.
Muy buen articulo, pero avanzado para mi.
Tengo un caso equivalente y que me rompe el cerebro.
Se puede hacer esto mismo que hiciste en tu articulo, pero en una columna calculada en la misma tabla origen? Es decir, todo en una sola tabla!!!

Ojala puedas ayudarme

    Francisco Mullor Publicado el1:48 pm - 26/07/2021

    Todas las transformaciones de datos que impliquen creación de columnas recomiendo hacerlas siempre en Power Query, en el editor de consulta. Las columnas calculadas hay que evitarlas en la medida de lo posible y en Power Query tienes muchisimas más alternativas para la transformación de datos aunque en este post haya resuelto un problema concreto del lookupvalue que se emplea en columnas calculadas con DAX

Alejandro Publicado el5:53 am - 19/10/2021

Muy buen artículo! Tengo una duda, esto mismo podría hacerse para valores numéricos, lo he intentado y me da errores.

Gracias y un saludo!!

Deja una respuesta