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.
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!
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.
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...
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?
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...
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
)
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.
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 |