cancel
Showing results for 
Search instead for 
Did you mean: 
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] )
)

View solution in original post

Helpful resources

Announcements
2022 Release Wave 1 760x460.png

2022 Release Wave 1 Plan

Power Platform release plan for the 2022 release wave 1 describes all new features releasing from April 2022 through September 2022.

Power BI December 2021 Update_carousel 768x460.jpg

Check it Out!

Click here to read more about the December 2021 Updates!

Jan 2022 Dev Camp 768x460 copy.png

Power BI Dev Camp- January 27th, 2022

Mark your calendars and join us for our next Power BI Dev Camp!

Top Kudoed Authors