Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

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.

Reply
Syndicate_Admin
Administrator
Administrator

Depuración de TREATAS en autoúnete

@AlexisOlson

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

smpa01_0-1638542935534.png

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]
        )
    )
)

smpa01_1-1638543004630.png

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.

smpa01_2-1638543053371.png

Gracias de antemano.

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

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:

AlexisOlson_0-1638555404287.png

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] )
)

View solution in original post

2 REPLIES 2
Syndicate_Admin
Administrator
Administrator

@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]
        )
    )
)

smpa01_0-1638558760359.png

Syndicate_Admin
Administrator
Administrator

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:

AlexisOlson_0-1638555404287.png

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] )
)

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.