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
Anonymous
Not applicable

Mejor manera de escribir esta medida DAX ?

Hola, chicos

¿Hay una mejor manera de escribir esta consulta DAX?

Esta medida está tomando para siempre para rellenar datos ya que tengo más de 5 millones de registros, pero me da datos correctos.. Para los usuarios su tiempo de espera después de 30 min.
Totalmente Sra. se necesitó al consultar con el analizador de rendimiento - 250000ms

No conseguimos encontrar tu ubicación exacta.

Esta medida se desarrolla para calcular el porcentaje de margen bruto alcanzado para 4 escenarios diferentes.

Citado GM -Ve y Actual GM +Ve
Citado GM +Ve y Gm real -ve
Citado GM +Ve y Gm real +Ve
Modificado GM -Ve y GM Real +ve

datos de muestra:

QotedGMActualGMGM attainment% - Valor correcto
-4189-53012.65%
56650589.22%
-129537-4437034.25%
74434045.70%
-104244334.62%
5695-629-111.04

Los sepequé como tres medidas diferentes y traté de sumarlas, todavía es lento.

El origen de datos es el modelo tabular del servidor de análisis y la conexión LIVE.


Pls help.thanks

Medida ?

CALCULAR (
DIVIDE (
SUM ( tabla[actual_margin] )
- SUM (tabla[[quoted_margin]] ),
SUM (tabla[[quoted_margin]] ),
0
) * -1,
FILTRO (
Mesa
SUM ( table[quoted_margin] ) < 0
),
FILTRO (
Mesa
SUM ( table[actual_margin] ) <> BLANK())
, FILTRO(
Mesa
SUM ( table[actual_margin] ) > 0
))
+
CALCULAR (
DIVIDE (
SUM ( tabla[actual_margin] )
- SUM (tabla[quoted_margin] ),
SUM (tabla[quoted_margin] ),
0
),
FILTRO (
Mesa
SUM ( table[quoted_margin] ) > 0
),
FILTRO (
Mesa
SUM ( table[actual_margin] ) < 0
)
)
+
CALCULAR (
DIVIDE (
SUM (tabla[actual_margin] ),
SUM (tabla[quoted_margin] ),
0
),
FILTRO (
Mesa
SUM ( table[quoted_margin] ) > 0
),
FILTRO (
Mesa
SUM ( table[actual_margin] ) > 0
)
)
+
CALCULAR (
DIVIDE (
SUM (tabla[actual_margin] ),
SUM (tabla[quoted_margin] ),
0
),
FILTRO (
Mesa
SUM ( table[quoted_margin] ) < 0
),
FILTRO (
Mesa
SUM ( table[actual_margin] ) < 0
)
)


Traté de usar variables e implementar la misma medida, aunque era muy rápido, pero el logro de margen se duplica y no es correcto.
A continuación se muestra la forma en que escribí la medida con la variable que se está duplicando.
Creo que estoy haciendo algo mal con la implementación de varialb.

Medida ?
var S_agm á sum(table[actual_margin])
var s_QGM á sum(table[quoted_margin)
CALCULAR (
DIVIDE (
S_AGM
- SUM (tabla[[quoted_margin]] ),
SUM (tabla[[quoted_margin]] ),
0
) * -1,
FILTRO (
Mesa
S_QGM < 0
),
FILTRO (
Mesa
S_AGM <> BLANK())
, FILTRO(
Mesa
S_AGM > 0
))
+
CALCULAR (
DIVIDE (
S_AGM
- S_QGM,
S_QGM,
0
),
FILTRO (
Mesa
S_QGM > 0
),
FILTRO (
Mesa
S_AGM < 0
)
)
+
CALCULAR (
DIVIDE (
S_AGM,
S_QGM,
0
),
FILTRO (
Mesa
S_QGM > 0
),
FILTRO (
Mesa
S_AGM > 0
)
)
+
CALCULAR (
DIVIDE (
S_AGM,
S_QGM,
0
),
FILTRO (
Mesa
S_QGM < 0
),
FILTRO (
Mesa
S_AGM < 0
)
)

Gracias

2 ACCEPTED SOLUTIONS
Anonymous
Not applicable

Una medida en sí misma no ocupa espacio. El cálculo, por otro lado, puede necesitar mucho espacio si no está optimizado correctamente y es necesario materializar una gran cantidad de datos. Pero su fórmula es simple y debe ejecutarse muy rápidamente. Sospecho que no conozco todos los detalles porque no has revelado todo sobre tu modelo.

En primer lugar, debe asegurarse de que la tabla de hechos solo usa las columnas que realmente necesita y que tienen los tipos de datos correctos. Esto también significa que usted tiene que decidir si sus decimales deben tener el número de decimales que está teniendo en este momento o si se pueden redondear a, por ejemplo, 2 decimales. Esto tiene un gran impacto en la huella de memoria de la tabla.

Además, debe tener un diseño adecuado, que significa "esquema de estrella". Si no lo haces, será mejor que empieces a crearlo.

En segundo lugar, usted está diciendo que está utilizando una conexión en vivo. ¿Entiendo que se trata de una conexión a un cubo tabular? Si no es así, y simplemente está utilizando una base de datos sql, entonces será mejor que optimice sus estructuras. En primer lugar, debería tener índices en las tablas, lo más probable es que necesite un índice de almacén de columnas en la tabla de hechos. No sé cuál es su sistema, así que sólo puedo decirle acerca de SQL Server, ya que esto es lo que soy experto en.

Esta medida (que es su medida) debe ser ardientemente rápida:

[Measure] =
var __actualMargin = SUM ( table[actual_margin] )
var __quotedMargin = SUM ( table[quoted_margin] )
var __result = 
 switch( true(),
 
  ( __quotedMargin * __actualMargin ) < 0,
   DIVIDE(
    sign( __quotedMargin ) * ( __actualMargin - __quotedMargin ),
    __quotedMargin
   ),   
   
  ( __quotedMargin * __actualMargin ) > 0,
   DIVIDE(
    __actualMargin,
    __quotedMargin
   )
  
 )
return
 __result

Si no lo es, entonces algo está realmente mal con su modelo o su computadora es muy débil.

Mejor
D

View solution in original post

Anonymous
Not applicable

15 REPLIES 15
v-lili6-msft
Community Support
Community Support

hola @vishnuva

Puede intentar usar variables para mejorar sus fórmulas. Esto debería mejorar su perforencia:

https://docs.microsoft.com/en-us/power-bi/guidance/dax-variables#improve-performance

saludos

Lin

Community Support Team _ Lin
If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.
Anonymous
Not applicable

hola @v-lili6-msft ,

Estoy de acuerdo, pero no estoy seguro de dónde necesito poner las variables como cuando creé la medida con varibable, los valores se están duplicando.

Nopt seguro de cómo solucionarlo

Gracias

V

Anonymous
Not applicable

Por favor, tome un buen libro en DAX o inscríbase en un curso en línea y comience su viaje. Hay mucho que tienes que descubrir y aprender sobre el idioma, así que no pierdas el tiempo.

Y aquí hay algo que parece la formulación que desea:

[Measure] =

 // This is the first part of your measure...
 var __actualMargin = SUM ( table[actual_margin] )
 var __quotedMargin = SUM ( table[quoted_margin] )
 var __shouldCalc = __quotedMargin < 0 && __actualMargin > 0
 return
  if( __shouldCalc,
  
   DIVIDE(
    (-1) * ( __actualMargin - __quotedMargin ),
    __quotedMargin
   )
   
  ) 
 +
 // Change the other parts accordingly.
 ...

Los filtros filtran la 'tabla' completa o devuelven una vacía porque cuando se calcula la SUMA debajo de ellos, no hay transición de contexto. Por lo tanto, eso significa que puede usar una expresión lógica simple como yo tengo arriba.

Mejor

D

Anonymous
Not applicable

Hola @darlove,
Gracias por los comentarios
Sí, sé que estoy siendo tonta en algunos conceptos básicos.
Gracias por responder. Intenté con la fórmula de muestra que sugeriste y lo improvisé . A continuación se muestra la lógica que creé con su sugerencia. Sin embargo, cuando ejecuto esta consulta nunca se ha rellenado ninguna reults . Su tiempo fuera por alguna razón. Es tomar para cada carga y nunca se cargó.
Creo que estoy haciendo algo mal. ¿Puede spls ayudarme con esto ?
GM%% ?
VAR A_GM
SUM ( FACT_DEALS_DPT[Margen bruto del cliente final USD] )
VAR Q_GM
SUM ( FACT_DEALS_DPT[Margen bruto cotizado Importe en dólares estadounidenses] )
Diferencia de VAR - A_GM - Q_GM
Caso de VAR1 - A_GM > 0 && Q_GM < 0
Caso de VAR2 - A_GM < 0 && Q_GM > 0
Caso de VAR3 - A_GM > 0 && Q_GM > 0
Caso VAR4 - A_GM < 0 && Q_GM < 0
devolución
SI (
case1,(-1)*
DIVIDE ( ( Diff ), Q_GM, 0 ),
SI (
case2,
DIVIDE (Diff, Q_GM, 0 ),
SI (
OR( caso3, caso4),
DIVIDE(A_GM,Q_GM,0)
----DIVIDE ( A_GM, Q_GM, 0 ), IF ( case4, DIVIDE ( A_GM, Q_GM, 0 ) ) ) ---
)
))
Anonymous
Not applicable

No entiendo la terminología que usas. Por favor, sea preciso.

1. Una medida es una fórmula que se calcula a petición de los datos subyacentes y responde al corte y el corte.
2. Una consulta es algo que se empieza con EVALUATE.
3. Una columna calculada es una columna en una de las tablas del modelo y se calcula solo cuando se cargan o actualizan los datos.

Además, dado que los casos en su fórmula son mutuamente excluyentes y hay más de 2, usted podría / debe utilizar SWITCH, no IF, para mayor claridad.

Si desea que este cálculo se realice en una columna calculada en una tabla de hechos que tiene decenas de millones de filas... Bueno, estás un poco de suerte a menos que tengas un servidor muy poderoso. Además, tenga en cuenta que las columnas calculadas en tablas de hechos grandes son una IDEA MUY BAD. Las tablas de hechos ya deben tener todas las columnas preparadas en el origen de datos. Siempre.

Mejor
D
Anonymous
Not applicable

Hola @darlove Disculpas por la confusión.

Estoy creando una medida y no una fórmula . Disculpa de nuevo si eso te confunde.

He utilizado la función IF ya que me respondió en su DAX con si la función .
Me pregunto si SWITCH funcionará en mi caso ... Dado que los datos de hecho tabla son enormes , Creo que puedo obtener "Sin error de memoria" también.

¿Cree que es una mejor idea escribir la lógica en la columna calculada en DB .

Tengo una memoria de 64gb en el servidor.

¿Puedo saber su sugerencia?

Mis filas totales en mi fáctil hasta ahora son 7607510 (7 millones)

Anonymous
Not applicable

Una medida en sí misma no ocupa espacio. El cálculo, por otro lado, puede necesitar mucho espacio si no está optimizado correctamente y es necesario materializar una gran cantidad de datos. Pero su fórmula es simple y debe ejecutarse muy rápidamente. Sospecho que no conozco todos los detalles porque no has revelado todo sobre tu modelo.

En primer lugar, debe asegurarse de que la tabla de hechos solo usa las columnas que realmente necesita y que tienen los tipos de datos correctos. Esto también significa que usted tiene que decidir si sus decimales deben tener el número de decimales que está teniendo en este momento o si se pueden redondear a, por ejemplo, 2 decimales. Esto tiene un gran impacto en la huella de memoria de la tabla.

Además, debe tener un diseño adecuado, que significa "esquema de estrella". Si no lo haces, será mejor que empieces a crearlo.

En segundo lugar, usted está diciendo que está utilizando una conexión en vivo. ¿Entiendo que se trata de una conexión a un cubo tabular? Si no es así, y simplemente está utilizando una base de datos sql, entonces será mejor que optimice sus estructuras. En primer lugar, debería tener índices en las tablas, lo más probable es que necesite un índice de almacén de columnas en la tabla de hechos. No sé cuál es su sistema, así que sólo puedo decirle acerca de SQL Server, ya que esto es lo que soy experto en.

Esta medida (que es su medida) debe ser ardientemente rápida:

[Measure] =
var __actualMargin = SUM ( table[actual_margin] )
var __quotedMargin = SUM ( table[quoted_margin] )
var __result = 
 switch( true(),
 
  ( __quotedMargin * __actualMargin ) < 0,
   DIVIDE(
    sign( __quotedMargin ) * ( __actualMargin - __quotedMargin ),
    __quotedMargin
   ),   
   
  ( __quotedMargin * __actualMargin ) > 0,
   DIVIDE(
    __actualMargin,
    __quotedMargin
   )
  
 )
return
 __result

Si no lo es, entonces algo está realmente mal con su modelo o su computadora es muy débil.

Mejor
D

Anonymous
Not applicable

Hola @darlove

No estoy seguro de lo que va mal.

Acabo de modificar la consulta que me mostraste e incluso eso es muy lento para mí.

No estoy seguro de cuál es la verdadera causa. Usted dijo que este meaure será tan rápido entonces supongo que podría ser . Puede ser que mi máquina esté exhasted después de que multtiples lo intente. Déjame intentarlo mañana y ver si funciona rápido

Tengo esquema de copo de nieve .

Traté de eliminar esta medida de la tabla en power bi y los datos se rellenan tan rápido . Cuando intento añadirlo agin , se vuelve tan lento.

Tengo una matriz visual grande con 10 columnas y 18 valores (o métricas). Puede ser que esto también pueda ser una razón. No sé.

. Permítanme también probar cualquier manera que viene a mi mente .

Anonymous
Not applicable

Hola @darlove ,

He encontrado el problema . El problema era que tenía alrededor de 12 filas y 12 valor creado en la matriz. También he añadido sub totales en pocos niveles como el nivel de cliente, nivel de región y nivel de ID. Puesto que tiene que calcular varios millones de reocrds se desaceleró ahora.

Me contraje las tablas de matriz, limité mis filtros y luego expandí VOILA fue tan rápido.

Muchas gracias por tu ayuda

All the Best

V

Anonymous
Not applicable

Gran.

Mejor
D
Anonymous
Not applicable

Las variables en lenguajes funcionales son IMMUTABLE. Una vez que se asignan, no pueden cambiar, por lo tanto, usarlos en los filtros de la manera que lo hace no tiene sentido.

Mejor
D
Anonymous
Not applicable

Utilice Power Query. DAX no es una herramienta para rellenar tablas de hechos.

Mejor
D
Anonymous
Not applicable

@darlove Estoy usando conexión en vivo . No estoy seguro de si puedo usar la consulta de energía .. ¿Puedo?
Mariusz
Community Champion
Community Champion

Hola @vishnuva

¿Puede proporcionar una muestra y explicar lo que está tratando de calcular?

Saludos
Mariusz

Si este post ayuda,entonces por favor considere aceptarlo como la solución.

Por favor, siéntase libre de conectarse conmigo.
Linkedin

Anonymous
Not applicable

hola @Mariusz

Edité mi publicación e incluyé más información.

Datos de muestra demasiado proporcionados.

Gracias

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.