Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.
Mis datos de origen son los siguientes (pbix está adjunto)
| Property | Attribute | Value |
|----------|-----------|-------|
| P1 | A1 | |
| P1 | A2 | |
| P1 | A3 | |
| P2 | A1 | |
| P2 | A2 | |
| P3 | A1 | |
| P4 | A1 | P3 |
| P5 | A3 | P1 |
Quiero que DAX devuelva una columna calculada en el conjunto de datos que buscará {Value,Attribute} en {Property,Attribute} y devolverá Property.
Mi salida deseada es la siguiente
| Property | Attribute | Value | return |
|----------|-----------|-------|--------|
| P1 | A1 | | |
| P1 | A2 | | |
| P1 | A3 | | P1 |
| P2 | A1 | | |
| P2 | A2 | | |
| P3 | A1 | | P3 |
| P4 | A1 | P3 | |
| P5 | A3 | P1 | |
Si tengo una tabla de búsqueda separada como esta
Puedo escribir una columna calculada por DAX como esta para alcanzar mi objetivo final
_lookupFromOtherTableTREATAS =
CALCULATE (
CALCULATE (
MAXX ( lookupTbl, lookupTbl[Value] ),
TREATAS (
SUMMARIZE ( 'Table', 'Table'[Property], 'Table'[Attribute] ),
lookupTbl[Value],
lookupTbl[Attribute]
)
)
)
Sin embargo, si quiero hacer una autocomponsión en la misma tabla usando TREATAS falla. Parece que no puedo entender por qué TREATAS falla en la autoúnete y qué se debe hacer aquí para que se comporte como se desea.
Gracias de antemano.
Solved! Go to Solution.
Este es un lío bastante enredado de contexto de fila y contexto de filtro que es difícil de desenredar. Pasé mucho tiempo tratando de entenderlo completamente, pero fue tiempo bien empleado perfeccionando mis conocimientos de DAX.
En aras de la concreción, resalmemos lo que sucede con la fila ("P2", "A1", "") de la Tabla2.
Al llamar a CALCULATE se convierte el contexto de fila en contexto de filtro, de modo que antes de considerar TREATAS, tenemos filtros [Property] = "P2", [Attribute] = "A1" y [Value] = "", así como los filtros en las columnas de la tabla expandida, lookupTbl[Attribute] = "A1" y lookupTbl[Value] = "P3".
La tabla RESUMIR tiene este aspecto:
Por lo tanto, el argumento del filtro TREATAS es esencialmente equivalente a
( Table2[Property], Table2[Attribute] ) IN
{ ( "", "A1" ), ( "", "A2" ), ( "", "A1" ), ( "P3", "A1" ), ( "P1", "A3" ) }
Entonces, ¿cómo se combinan estos filtros? Como se explica aquí:
Un argumento de filtro reemplaza los filtros correspondientes existentes sobre las mismas columnas, a menos que esté incrustado en KEEPFILTERS.
Esto significa que los filtros de Table2[Property] y Table2[Attribute] de la transición de contexto se reemplazan mediante el argumento de filtro TREATAS (consulte el paso 5 del vínculo anterior). El filtro Table2[Property] = "P2" se reemplaza, pero mientras que el filtro de Table2[Attribute] también se reemplaza, la columna de la tabla expandida,lookupTbl[Attribute], no se ve afectada. Los resultados cambiarán si elimina la relación de lookupTbl[Atributo] 1-->* Tabla2[Atributo].
Manteniendo lookupTbl[Attribute] = "A1" de la tabla expandida, los filtros restantes de Table2 se reducen a
( Table2[Property], Table2[Attribute] ) IN { ( "", "A1" ), ( "P3", "A1" ) } && Table2[Value] = ""
Solo la fila ("P3", "A1", "") cumple esta condición, por lo que el máximo de [Propiedad] sobre esta fila es "P3".
Puede corregir su DAX envolviendo KEEPFILTERS alrededor del argumento TREATAS (esto evitaría la anulación del contexto de fila), pero la forma más fácil de hacerlo es con una búsqueda simple:
LOOKUPVALUE (
Table2[Value],
Table2[Attribute], Table2[Attribute],
Table2[Value], Table2[Property]
)
O si insiste en usar CALCULATE:
CALCULATE (
MAX ( Table2[Value] ),
ALLEXCEPT ( Table2, Table2[Attribute] ),
Table2[Value] = EARLIER ( Table2[Property] )
)
@AlexisOlson no puedo agradecerte por el tiempo que dedicaste a disectar y, en última instancia, darme una solución y una buena explicación.
Cuando siento que tengo un mejor control de DAX, entonces DAX encuentra formas de humillarme 😂😂
Esta es una solución tan épica que usted proporcionó que KEEPFILTERS puede hacer eso, OMG.. esto me ha molestado por un tiempo. Prefiero tomarme mi tiempo para leer su explicación y los enlaces que proporcionó y publicar cualquier Q de seguimiento que pueda tener.
También le he hecho a Marco la misma pregunta.
Gracias por su tiempo, esfuerzo, paciencia y disposición para ayudarme a domar DAX.
Necesitamos tomar una cerveza algún día juntos !!! 🍺
Solo para que los futuros lectores lo sepan
Column =
CALCULATE (
MAXX ( Table2, Table2[Property] ),
KEEPFILTERS (
TREATAS (
SUMMARIZE ( Table2, Table2[VALUE], Table2[Attribute] ),
Table2[Property],
Table2[Attribute]
)
)
)
Este es un lío bastante enredado de contexto de fila y contexto de filtro que es difícil de desenredar. Pasé mucho tiempo tratando de entenderlo completamente, pero fue tiempo bien empleado perfeccionando mis conocimientos de DAX.
En aras de la concreción, resalmemos lo que sucede con la fila ("P2", "A1", "") de la Tabla2.
Al llamar a CALCULATE se convierte el contexto de fila en contexto de filtro, de modo que antes de considerar TREATAS, tenemos filtros [Property] = "P2", [Attribute] = "A1" y [Value] = "", así como los filtros en las columnas de la tabla expandida, lookupTbl[Attribute] = "A1" y lookupTbl[Value] = "P3".
La tabla RESUMIR tiene este aspecto:
Por lo tanto, el argumento del filtro TREATAS es esencialmente equivalente a
( Table2[Property], Table2[Attribute] ) IN
{ ( "", "A1" ), ( "", "A2" ), ( "", "A1" ), ( "P3", "A1" ), ( "P1", "A3" ) }
Entonces, ¿cómo se combinan estos filtros? Como se explica aquí:
Un argumento de filtro reemplaza los filtros correspondientes existentes sobre las mismas columnas, a menos que esté incrustado en KEEPFILTERS.
Esto significa que los filtros de Table2[Property] y Table2[Attribute] de la transición de contexto se reemplazan mediante el argumento de filtro TREATAS (consulte el paso 5 del vínculo anterior). El filtro Table2[Property] = "P2" se reemplaza, pero mientras que el filtro de Table2[Attribute] también se reemplaza, la columna de la tabla expandida,lookupTbl[Attribute], no se ve afectada. Los resultados cambiarán si elimina la relación de lookupTbl[Atributo] 1-->* Tabla2[Atributo].
Manteniendo lookupTbl[Attribute] = "A1" de la tabla expandida, los filtros restantes de Table2 se reducen a
( Table2[Property], Table2[Attribute] ) IN { ( "", "A1" ), ( "P3", "A1" ) } && Table2[Value] = ""
Solo la fila ("P3", "A1", "") cumple esta condición, por lo que el máximo de [Propiedad] sobre esta fila es "P3".
Puede corregir su DAX envolviendo KEEPFILTERS alrededor del argumento TREATAS (esto evitaría la anulación del contexto de fila), pero la forma más fácil de hacerlo es con una búsqueda simple:
LOOKUPVALUE (
Table2[Value],
Table2[Attribute], Table2[Attribute],
Table2[Value], Table2[Property]
)
O si insiste en usar CALCULATE:
CALCULATE (
MAX ( Table2[Value] ),
ALLEXCEPT ( Table2, Table2[Attribute] ),
Table2[Value] = EARLIER ( Table2[Property] )
)
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
2 | |
2 | |
2 | |
2 | |
1 |