Sentencia IF

Estimados,

su apoyo como con la medida en la columna calculada GananciaAcum:=if(cliente[ganacia]>0,sumx(FILTER(cliente, cliente[ganacia]>= EARLIER(cliente[ganancia )), cliente[ganancia]),blank()), el acumulado numero 17 se repite en cliente D y E y la categoria B tambien, estas deben estar en blanco.

gracias por su apoyo.

Cliente     ganancia     Ganancia Acum    Categoria

A                9                   9                           A

B               5                   14                          B

C               3                   17                         B

D                                     17                       B

E                                    17                        B

 


 

Hola Ricardo,

Imagino que la expresión que muestras en tu mensaje no es una copia exacta de lo que tienes en Power BI (haces referencia a un campo "ganacia" que no existe). He replicado tu tabla y el código (sin errores) y me funciona bien. El código es el siguiente:

GananciaAcum = IF(
    cliente[ganancia]>0;
    SUMX(
        FILTER(cliente; cliente[ganancia] >= EARLIER(cliente[ganancia]));
        cliente[ganancia]);
    BLANK())

Y aquí tienes una captura de pantalla del resultado:

Sentencia IF

(la columna Categoría no sé exactamente cómo la creas)

Si no se trata de un problema de variables (el error comentado entre "ganacia" y "ganancia") ¿puede ser que lo que aparentan ser celdas vacías en la columna "ganancia" (las de los clientes D y E) no lo sean realmente y que DAX las esté dejando pasar el filtro de "cliente[ganancia] > 0"?

Un saludo

Daniel

 

 

 

 

 

Hola Daniel,

Lo primero he tenido un error en la digitación lo correcto es ganancia y aplique la medida y funciona, pero ahora tengo un problema adicional. la categoria "A" se esta repitiendo en D y E cosa que no debe ocurrir y bueno solo estoy insertando un pequeño ejemplo del problema.

tengo una columna de %GananciaAcum = DIVIDE(Cliente[GananciaAcum], SUM(Cliente[ganancia])) y la ultima ultima columna Categoria

: =SWITCH(TRUE(), Cliente[%GananciaAcum]<=0.8, "A", "B").

Cliente     ganancia     GananciaAcum    %GananciaAcum      Categoria

A                9                   9                                                            A

B               5                   14                                                           B

C               3                   17                                                          B

D                                                                                                  A

E                                                                                                  A

Desde ya te agradezco el apoyo, o te envio el archivo algun email me confirmas.

Saludos.

Hola Daniel,

Lo primero he tenido un error en la digitación lo correcto es ganancia  aplique y funciona, pero ahora tengo un problema adicional. la categoria "A" se esta repitiendo en D y E cosa que no debe ocurrir y bueno solo estoy insertando un pequeño ejemplo del problema.

tengo una columna de %GananciaAcum = DIVIDE(Cliente[GananciaAcum], SUM(Cliente[ganancia])) y la ultima

ultima columna Categoria= SWITCH(TRUE(), Cliente[%GananciaAcum]<=0.8, "A", "B").

Cliente     ganancia     GananciaAcum    %GananciaAcum      Categoria

A                9                   9                                                            A

B               5                   14                                                           B

C               3                   17                                                          B

D                                                                                                  A

E                                                                                                  A

Hola,

DAX está interpretando los valores nulos de la columna %GananciaAcum como ceros. Una solución fácil es adelantarte a DAX y generar tú mismo un valor para los blanks (como sabes, la función SWITCH termina en cuanto se encuentra una primera condición que se satisfaga). Por ejemplo:

Categoría = SWITCH(
    TRUE();
    ISBLANK(cliente[GananciaAcum]); BLANK();
    Cliente[%GananciaAcum]<=0,8; "A";
    "B")

Es decir, si es blank, devolvemos un blank. Y si no, se hace la comparación normal:

Blanks en SWITCH

Espero que te sirva.

Un saludo

Daniel

Hola Daniel, 

Buenas noches, aquí de nuevo, del ejemplo la columna ganancia los números eran positivos pero ingrese números negativos y la columna calculada GananciaAcum  la condicion IF no considera los negativos.

las otras  columnas calculadas %gananciaAcum y categoria  quedan en blanco.

https://jumpshare.com/v/1newQKZWM3d7uzaALKKg

adjunto imagen.

Saludos.

Ricardo

 

 

 

Hola Ricardo,

No te funciona porque el IF está dejando pasar solo las filas en las que cliente[ganancia] tome un valor positivo. Tú lo tenías en tu código original y yo lo mantuve (porque no sé qué representa exactamente esa ganancia ni la ganancia acumulada: no sé si tiene sentido que tome un valor negativo o no, por ejemplo). En todo caso, sin meterme en lo que representen esos conceptos, para que se consideren todos los valores y se sigan excluyendo los BLANK, basta con modificar el código DAX que define GananciaAcum. Por ejemplo:

GananciaAcum = IF(
    NOT(ISBLANK(cliente[ganancia]));
    SUMX(
        FILTER(cliente; cliente[ganancia] >= EARLIER(cliente[ganancia]));
        cliente[ganancia]);
    BLANK())

Esto podría traducirse como "Si el valor cliente[ganancia] no es un blank, considera la fila y calcula lo que haya que calcular". Mi código funcionando:

Sentencia IF

Metí otro cliente ("F") para que hubiera alguno con blank...

Dime qué tal...

Hola Daniel, buenas noches.

Efectivamente los números negativos son datos reales en mi trabajo por notas de créditos que no se hizo en el mes de la venta, el dax IF  de la columna gananciaacum lo entendí pero si observamos no esta restando bien o acumulando correctamente ejemplo 17-14=13 pero acumula 11?? el % acum debe terminar en 100% pero termina en 136%, te adjunto tabla dinámica así debería quedar.

 https://jumpshare.com/v/LWP2iMw11fq87UxP6pgv

saludos

 

Hola de nuevo, Ricardo

Ese cálculo no es el que quieres porque en tu filtro estás especificando que se sumen los valores cuya ganancia sea mayor o igual que el "actual". Es decir, estás recorriendo la tabla de arriba hacia abajo pero estás sumando no los valores de las filas previas, sino los de los registros que cumplan esa condición (ganancia mayor o igual que la actual), con independencia de donde estén. Dicho con otras palabras, para la... segunda fila (por poner un ejemplo, no es real) es posible que estés sumando la ganancia de las filas 1, 2 y 5... Esto te funciona solo si los valores son decrecientes (como eran tus primeros valores), pero en los nuevos valores que indicas ya no se cumple (se cumpliría si los valores fuesen 9, 5, 3, -2 y -4).

Si lo que quieres es que se incluyan todos los clientes ya considerados (en las filas anteriores) y éstos no están ordenados según la ganancia, puedes probar con esto (he cambiado los valores para que no sean todos decrecientes y confirmar que funciona bien):

GananciaAcum = IF(
    NOT(ISBLANK(cliente[ganancia]));
    SUMX(
        FILTER(cliente; cliente[cliente] <= EARLIER(cliente[cliente]));
        cliente[ganancia]);
    BLANK())

Sentencia IF

Ten en cuenta que estamos considerando como criterio de filtro el nombre del cliente (pues la tabla está ordenada de este modo). Nuevamente, si estos nombres no están ordenados, no funcionaría. Otra alternativa sería ordenar la tabla (según un criterio arbitrario, como la ganancia, así te funcionaría el código de ayer) y aplicar el filtro según dicho criterio, aunque esto sería un poco más complejo. Esto podrías conseguirlo con la función TOPN, por ejemplo.

En resumen, necesitas un criterio de filtrado en el que poder confiar para aplicar el código. Si la tabla está ordenada según el campo X, ese es el criterio (identificador de cliente, nombre del cliente, fecha de alta...). Si no hay ningún campo que indique la ordenación, no confiaría en que las filas se fuesen a recorrer de la forma adecuada.

Un saludo

Daniel

Hola Daniel,

Lo tengo claro tus indicaciones , una pregunta final

1. De las consultas anteriores columnas calculadas las puedo reemplazar por medidas? es igual o hay alguna mejora.

2. Alguna recomendación de equipo laptop para trabajar el power bi .

Un abrazo.

Ricardo

Respondo a las dos preguntas:

1. No son intercambiables, piensa que creando columnas calculadas estás trabajando con contexto de fila. Puedes convertir el contexto de fila en contexto de filtro con CALCULATE, pero... no es como crear una medida.

2. Pues depende mucho del uso que quieras darle. Yo tengo un portátil bastante potente (32 Gb de memoria, pantalla inmensa, disco SSD 1T, GPU NVidia compatible con el estándar CUDA para el entrenamiento de redes neuronales...), pero para dar formación, si tienes que cargar con él (cosa que hago muy a menudo) es demasiado pesado. Si me comprase ahora otro, optaría por un ultraligero, con 16 Gb (para formación no necesito más), 512 o 1024 Gb de disco ssd, i7 (o superior) y no le daría tanta importancia a la GPU (para eso tengo el portátil y una estación de trabajo con 64 Gb y una GPU mejor todavía). Me costaría caro, pero mi espalda lo agradecería.

Una vez dicho esto, tengo que decir que Power BI hace una gestión fantástica de la memoria: si no vas a trabajar con datos inmensos, puedes utilizar "casi" cualquier ordenador.

Enviado por Ricardo el Dom, 22/09/2019 - 07:07