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
isThisABug
Frequent Visitor

Análisis de columnas calculadas

Hola a todos, quiero publicar esto con el fin de mejorar mis habilidades y obtener una mejor comprensión de Power BI.

El problema que he resuelto es crear una columna calculada que concatena otras columnas que han escrito un nombre de producto, por lo que tenemos la columna 1 del producto 1, la columna 2 del producto 2... hasta las 5 en mi caso. La parte difícil es que quiero mostrar el resultado en orden alfabético para poder hacer algunos cálculos basados en las columnas sin tener datos duplicados porque el nombre de los productos no se ordenan al principio.

Así que este es el código que creé:

cadena productos ordenados = 

var p1 = 'Table'[Product 1]
return

var p2 = 'Table'[Product 2]
return

var p3 = 'Table'[Product 3]
return

var p4 = 'Table'[Product 4]
return

var p5 = 'Table'[Product 5]
return

var word5 = 
MAX(
    MAX(
        MAX(
            MAX(
                p1;
                p2
            );
            p3
        );
        p4
    );
    p5
)
return

var word4 =
MAX(
    MAX(
        MAX(
            MAX(
                IF(p1=word5;BLANK();p1);
                IF(p2=word5;BLANK();p2)
            );
            IF(p3=word5;BLANK();p3)
        );
        IF(p4=word5;BLANK();p4)
    );
    IF(p5=word5;BLANK();p5)
)
return

var word3 =
MAX(
    MAX(
        MAX(
            MAX(
                IF(OR(p1=word5;p1=word4);BLANK();p1);
                IF(OR(p2=word5;p2=word4);BLANK();p2)
            );
            IF(OR(p3=word5;p3=word4);BLANK();p3)
        );
        IF(OR(p4=word5;p4=word4);BLANK();p4)
    );
    IF(OR(p5=word5;p5=word4);BLANK();p5)
)
return

var word2 =
MAX(
    MAX(
        MAX(
            MAX(
                IF(OR(p1=word3;OR(p1=word5;p1=word4));BLANK();p1);
                IF(OR(p2=word3;OR(p2=word5;p2=word4));BLANK();p2)
            );
            IF(OR(p3=word3;OR(p3=word5;p3=word4));BLANK();p3)
        );
        IF(OR(p4=word3;OR(p4=word5;p4=word4));BLANK();p4)
    );
    IF(OR(p5=word3;OR(p5=word5;p5=word4));BLANK();p5)
)
return

var word1 =
MAX(
    MAX(
        MAX(
            MAX(
                IF(OR(p1=word2;OR(p1=word3;OR(p1=word5;p1=word4)));BLANK();p1);
                IF(OR(p2=word2;OR(p2=word3;OR(p2=word5;p2=word4)));BLANK();p2)
            );
            IF(OR(p3=word2;OR(p3=word3;OR(p3=word5;p3=word4)));BLANK();p3)
        );
        IF(OR(p4=word2;OR(p4=word3;OR(p4=word5;p4=word4)));BLANK();p4)
    );
    IF(OR(p5=word2;OR(p5=word3;OR(p5=word5;p5=word4)));BLANK();p5)
)
return

CONCATENATE(
    word1;
    CONCATENATE(
        IF(ISBLANK(word1);BLANK();", ");
        CONCATENATE(
            word2;
            CONCATENATE(
                IF(ISBLANK(word2);BLANK();", ");
                CONCATENATE(
                    word3;
                    CONCATENATE(
                        IF(ISBLANK(word3);BLANK();", ");
                        CONCATENATE(
                            word4;
                            CONCATENATE(
                                IF(ISBLANK(word4);BLANK();", ");
                                word5
                            )
                        )
                    )
                )
            )
        )
    )
)

Creo que este código se puede mejorar con tablas virtuales tal vez, pero aún no sé cómo usarlas correctamente. Estaré encantado de recibir cualquier comentario de usted.

¡Gracias!

10 REPLIES 10
Anonymous
Not applicable

¿Dax? ¿Realmente? Use Power Query. No intentes apretar una clavija cuadrada en un agujero redondo.

Mejor
D

Oh sí, duh, olvidó CONCATENATEX tiene un orden por expresión:

Sort 3 = 
    VAR __Table =  { [Product 1], [Product 2], [Product 3], [Product 4], [Product 5] }
RETURN
    CONCATENATEX(__Table,[Value],",",[Value],ASC)

O, en una sola línea:

Sort 4 = CONCATENATEX({ [Product 1], [Product 2], [Product 3], [Product 4], [Product 5] },[Value],",",[Value],ASC)
    

@darlove No estoy seguro de por qué una sola línea de código DAX es una clavija cuadrada. Quiero decir, posiblemente podría hacerlo en una sola línea de código M, pero no veo que sea mejor que una sola línea de código DAX.


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

Estimado Sr. @Greg_Deckler,

En primer lugar, porque se trata de mashup de datos. En segundo lugar, porque las columnas de cálculo de DAX no se comprimen de forma óptima. En tercer lugar, porque en M no tienes que codificar de forma rígida el número de productos. Las otras razones por las que estoy seguro de que podrás averiguarlo tú solo.

¿No es esto suficiente para entender que DAX es un lenguaje eXpressions de análisis de datos que no es apto para las operaciones de mashup de datos? Por cierto, los flujos de trabajo de datos utilizan M, no DAX. POR UNA BUENA RAZON.

Que algo es posible en un idioma no significa que se debe hacer.

Mejor
D

Excepto que si usted lee el siguiente post @darlove , no tuve que codificar nada. Hay literalmente una sola función en como en 1 función, uno Función, una función que hace exactamente lo que @isThisABug está tratando de hacer. Entonces, ¿cómo un tener una sola función que está explícitamente diseñada para hacer exactamente el trabajo que está tratando de hacer constituye una clavija cuadrada? Esto es como llamar a un martillo una "clavija cuadrada" para el trabajo de golpear un clavo. La función CONCATENATEX fue diseñada literalmente para hacer el trabajo exacto a la mano. No fue un accidente que hubiera parámetros para ordenar. No es sólo un uso novedoso de algo que no fue diseñado para propósitos. Literalmente no hay otra razón por la que la funcionalidad de ordenación se habría incluido en CONCATENATEX que no sea para resolver este problema. Por lo tanto, llamarlo una clavija cuadrada es una tontería. Es una tontería absoluta.

Además, la pregunta original era "cómo usar expresiones de tabla DAX para mejorar el código". Puede que esté leyendo mal las cosas, pero no creo que diga "Oye, por favor, chastisé".

¿Existen ventajas y desventajas para ambos enfoques. Sí. Pero llamar a DAX una clavija cuadrada cuando tiene una función que ha sido diseñada específicamente, y me refiero a propósito construido, para llevar a cabo la tarea en cuestión es sólo ser... Bien... Lo dejaré ahí.

¿Y qué tienen que ver los flujos de datos con cualquier cosa y el mashup de datos. Yeeesss, por supuesto Microsoft usaría código M para flujos de datos porque es literalmente la misma operación que importar datos... así que... Seguramente una columna calculada simple utilizando un propósito de función creado para la tarea no es mashup de datos? Al menos no en la misma línea que el verdadero mashup de datos.

Y BTW este es un argumento invencible. No hay nada que sea posible hoy en día en Python o R o Ruby o cualquier otro lenguaje de programación de moda que no se pudiera hacer en ningún lenguaje de programación anterior como C o Java o para el caso COBOL o Fortran. Todo se reduce a 1 y 0 finalmente, pero sorprendentemente la gente todavía usa el lenguaje que les apetece usar al final. Podría hacer fácilmente un argumento de que todo el mundo que utiliza Power Query en lugar de EMML es una locura, pero todo sería pontificación y aire caliente porque a nadie realmente le importa, siempre y cuando puedan hacer el trabajo. Me refiero a Power Query... ¿Realmente? Ni siquiera tiene portabilidad de diseño mashup e interoperabilidad de soluciones mashup. ¿Qué clase de noob usaría tal cosa? ¡Qué herramienta tan terrible para el trabajo! ¡Quiero decir que Power Query es risiblemente inferior! No hay compatibilidad con scripts incrustados para JavaScript, JRuby, Groovy o XQuery. Y no hay sintaxis paralela para el procesamiento simultáneo. Quiero decir, tendrías que ser un granate completo y absoluto para usar Power Query para algo como data mashup, ¡está completamente mal adaptado para la tarea en comparación con EMML!

Y por eso este tipo de debates no tienen sentido...


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Anonymous
Not applicable

Sí... Discutir con usted realmente no tiene sentido.

Hay diferentes lenguajes de programación para diferentes propósitos. Hacer todo en uno es una señal de que no entiendes nada de programación. El hecho de que algo sea posible en un idioma no significa que deba hacerse. No tengo tiempo para explicar cosas tan simples.

Su tirada de arriba sólo muestra muy claramente que tiene mucho que aprender, señor Gregory.

Mejor
D

Sólo para que quede claro entonces @darlove, para que todos podamos estar de acuerdo y ser amigos, tener una función nativa, incorporada en un lenguaje de programación que está diseñado específicamente para una tarea en particular y luego usar dicha función pupose construida para exactamente la tarea para la que fue diseñado constituye poner una clavija cuadrada en un agujero redondo. ¿Correcto? ¿Para eso vamos? ¿Todos están de acuerdo con eso?


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

Aquí está el código M:

Text.Combine( List.Sort({[Product 1], [Product 2], [Product 3], [Product 4], [Product 5]} ),"," )

M requiere 2 funciones para hacer lo que DAX puede hacer en 1 función. Sólo, sólo, sólo señalando que... 🙂 Supongo que uno de ellos es un peg cuadrado...


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

En primer lugar, muchas gracias por su respuesta rápida!

Su código era muy útil, el DAX y la versión M. Soy bastante nuevo en este mundo y no tenía idea de esos 2 idiomas hace 4 meses, no estoy acostumbrado a este tipo de programación.

Al final conseguí la versión M debido al manejo correcto de comas. El DAX fue mi primera opción, pero en algunas columnas la celda está vacía y necesito mostrarla en blanco y con el código DAX tendré que implementar de nuevo el hanlding BLANK(), no lo mencioné antes lo siento. Con el código M se hizo automáticamente por eso que lo he elegido.

Muchas gracias por real,

¡Saludos!

@isThisABug - Tiene todo el sentido para mí, en DAX podrías haber hecho eso así, sólo un FYI:

Sort 4 = CONCATENATEX( FILTER({ [Product 1], [Product 2], [Product 3], [Product 4], [Product 5] },NOT(ISBLANK([Value]))),[Value],",",[Value],ASC)

En este punto es probable que desee escribir en una forma bien formateada como:

Sort 4 = 
  CONCATENATEX( 
    FILTER(
      { [Product 1], [Product 2], [Product 3], [Product 4], [Product 5] },
      NOT(ISBLANK([Value]))
    ),
   [Value],",",[Value],ASC
  )


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...
Greg_Deckler
Super User
Super User

Bueno, @isThisABug aquí hay una mejora potencial. No estoy del todo contento con él porque todavía está ligado a un enfoque máximo razonable, tienes que codificarlo para el número de elementos en su tipo. Pero, es potencialmente un punto de partida. PBIX está unido.

Column = 
    VAR __Table = { [Product 1], [Product 2], [Product 3], [Product 4], [Product 5] }
    VAR __word5 = MAXX(__Table,[Value])
    VAR __word4 = MAXX(EXCEPT(__Table,{ __word5 }),[Value])
    VAR __word3 = MAXX(EXCEPT(__Table,{ __word5, __word4 }),[Value])
    VAR __word2 = MAXX(EXCEPT(__Table,{ __word5, __word4, __word3 }),[Value])
    VAR __word1 = MINX(__Table,[Value])
RETURN
    CONCATENATEX({__word1, __word2, __word3, __word4, __word5 },[Value],",")

Me gusta su implementación de un tipo de burbuja, básicamente estoy usando la misma técnica.


@ me in replies or I'll lose your thread!!!
Instead of a Kudo, please vote for this idea
Become an expert!: Enterprise DNA
External Tools: MSHGQM
YouTube Channel!: Microsoft Hates Greg
Latest book!:
The Definitive Guide to Power Query (M)

DAX is easy, CALCULATE makes DAX hard...

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.