Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
yaguilej
Contributor II
Contributor II

Intervalos con la funcion Dual

Hola,  quiero montar una gráfica que por una serie de intervalos me de el valor promedio de unos pedidos. Me funciona el primer If el que corresponde al 20% pero los siguientes ya no se como probar, he pensado que podía venir por las variables, le he quitado y puesto el $, pero no acabo de encontrar donde podría estar el error. Quitando el $ a todas las Variables, al menos me muestra la gráfica aunque solo sea con el 20%.

= if(
 (Aggr({<Id_PdR={'*'}>}
      sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
           Id_PdR)
 <= vMedia2),
  dual('0 < x < vMedia2',20)
 ,if(
 (Aggr({<Id_PdR={'*'}>}
      sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
           Id_PdR)
 > vMedia2
    and
 Aggr({<Id_PdR={'*'}>}
      sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
           Id_PdR)
 <= vMedia4),
  dual('vMedia2 < x < vMedia4',40)
  ,if(
 (Aggr({<Id_PdR={'*'}>}
      sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
           Id_PdR)
 > vMedia4
    and
 Aggr({<Id_PdR={'*'}>}
      sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
           Id_PdR)
 <= vMediaM4),
  dual('vMedia4 < x < vMediaM4',60)
  ,if(
 (Aggr({<Id_PdR={'*'}>}

1 Solution

Accepted Solutions
rubenmarin

Si con valores fijos funciona y con variable no solo hay que centrarse en la variable, y para que la variable devuelve un valor y no una expresión habría que añadirle un igual (=) delante. Para que no afecte a la tabla que me has mostrado antes donde se calculaba por concepto tendría que ser otra variable.

Por ejemplo de la variable "vVar" con contenido "Sum(...)" habría que crear la variable "vVarValor" con contenido "=$(vVar)" y usar estas variables en la expresión. 

También puedes probarlas primero en una tabla o un objeto de texto para ver que devuelven el valor correcto.

View solution in original post

11 Replies
rubenmarin

Hola, aggr() devuelve un valor por cada combinación de valores de su parámetro por loq ue no se podria compara un conjunto de valores con un único valor.

Te está mostrando el primero porque  "<= vMedia2)" está cerrando el paréntesis de antes del aggr(), en vez del if.

Si lo quieres es segmentar los Id_PdR según si están por encima o debajo de ciertos valores deberías incluir el if dentro del aggr, algo como:

Aggr({<Id_PdR={"*"}>}
  If(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])<=vMedia2
  ,dual('0 < x < vMedia2',20)
  ,If(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])>vMedia2 and sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])<=vMedia4
    ,dual('vMedia2 < x < vMedia4',40)
    ,If(...
))) // Cerrar Ifs
, Id_PdR) // Cerrar Aggr

También puedes inclur la expresión en una variable para que todo se más fácil de leer:

Variable vValorPedidosFY con contenido: sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])

Aggr({<Id_PdR={"*"}>}
  If($(vValorPedidosFY)<=vMedia2
  ,dual('0 < x < vMedia2',20)
  ,If($(vValorPedidosFY)>vMedia2 and $(vValorPedidosFY)<=vMedia4
    ,dual('vMedia2 < x < vMedia4',40)
    ,If(...
))) // Cerrar Ifs
, Id_PdR) // Cerrar Aggr

Hay un grupo dedicado a consultas en español: https://community.qlik.com/t5/Qlik-en-Espa%C3%B1ol/gp-p/spanish-group

 

yaguilej
Contributor II
Contributor II
Author

Muchas gracias Ruben, pero sigue sin funcionar, la expresión de la fórmula la acepta, no obstante, no me muestra los intervalos.

=Aggr({<Id_PdR={"*"}>}
 If(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])
    <=vMedia2 ,
    dual('0 < x < vMedia2',20) ,
    If(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])
    >vMedia2
    and sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])
    <=vMedia4 ,
    dual('vMedia2 < x < vMedia4',40) ,
    If(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])
    > vMedia4
    and sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])
    <= vMediaM4
    dual('vMedia4 < x < vMediaM4',60),
    If(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])
    >vMediaM4
    and sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])
    <= vMediaM2
    dual('vMediaM4 < x < vMediaM2',80),
    If(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido])
    > vMediaM2
    dual('x > vMediaM2',100)
    ))))), Id_PdR)

Saludos

Yolanda

rubenmarin

Hola Yolanda, si puedes subir un ejemplo aunque sea con datos ficticios creados usando una tabla inline podría echarle un vistazo.

También me vendría bien los resultados que esperas según los datos de la tabla inline, para confirmar a donde hay que llegar.

Saludos.

yaguilej
Contributor II
Contributor II
Author

Buenos días, Este es el nuevo código, he cambiado las Variables respecto al ejemplo que pasé ayer. Perdona pero no se como adjuntar la tabla para que veas los promedios. Por favor, me podrías indicar como?

Muchas gracias por la ayuda

= Aggr({<Id_PdR={'*'}>}

    If(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
          
 <= v85PromedioOnAirSolPro,
   
  dual('0 < x < v85PromedioOnAirSolPro',85),
       
  if(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
         
 > v85PromedioOnAirSolPro
    and
 sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
          
 <= v95PromedioOnAirSolPro,
  dual('v85PromedioOnAirSolPro < x < v95PromedioOnAirSolPro',95),
  if(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
         
 > v95PromedioOnAirSolPro
    and
   sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
          
 <= v105PromedioOnAirSolPro,
  dual('v95PromedioOnAirSolPro < x < v105PromedioOnAirSolPro',105),
  if(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
          
 > v105PromedioOnAirSolPro
    and
       sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
         
 <= v115PromedioOnAirSolPro,
  dual('v105PromedioOnAirSolPro < x < v115PromedioOnAirSolPro',115),
  if(sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]),
          
 > v115PromedioOnAirSolPro,
 dual('x > v105PromedioOnAirSolPro',115)
))))),Id_PdR)

rubenmarin

Para hacer la tabla sería hacer una copia de la app y usar una tabla inline para crear datos de prueba y hacer pruebas:

LOAD * Inline [
Id_PdR, Fecha, dFecha, Valor de pedido
1, Pedido, 01/04/2020, 50
2, Pedido, 01/04/2020, 90
... rellenar con más datos
];

Probar primero una tabla con Id_PdR como dimensión y la expresión sum({<Fecha={'Pedido'},dFecha={">=$(=makedate($(=max(FY)-1),7,1))"},[Valor de pedido]={">0"}>}[Valor de pedido]) para ver si devuelve el dato que esperas.

Luego probar la  expresión, respecto a la expresión mejor dejar solo 2 rangos hasta que divida bien esos dos, cuando funcione ya añades el resto.

Y por otra parte el {<Id_PdR={'*'}>} del principio yo lo puse como {<Id_PdR={"*"}>} para que recupere los distintos Id_PdR, si es comilla simple puede que te filtre por el valor fijo *.

Y también vendría bien una tabla aunque sea creada manualmente para ver el resultado que esperas y como quieres que se visualice.

yaguilej
Contributor II
Contributor II
Author

Concepto_Pto$(vPromedioOnAirSolPro)

$(v85PromedioOnAirSolPro)$(v95PromedioOnAirSolPro)$(v105PromedioOnAirSolPro)$(v115PromedioOnAirSolPro)Promedio On Air SolProPromedio *0,85=num($(vPromedioOnAirSolPro),'#.##0,0K€')


=num(($(vPromedioOnAirSolPro)*0.85),'#.##0,0K€')

Concepto6757357.436,9K€64.194,1K€70.951,4K€77.708,7K€67,5757,4467.572,7757.436,9K€
Concepto2772223.563,7K€26.335,9K€29.108,1K€31.880,3K€27,7223,5627.722,0023.563,7K€
Concepto7642864.963,6K€72.606,4K€80.249,2K€87.891,9K€76,4364,9676.427,7764.963,6K€
yaguilej
Contributor II
Contributor II
Author

Rubén, he adjuntado la tabla, quisiera mostrarte como debería quedar la gráfica, ya que sí que me funciona con el primer promedio, pero no se como adjuntarlo, si me indicas como adjuntar una imagen.

Gracias

rubenmarin

En esa tabla veo que la variable tiene un valor distinto dependiendo del concepto, si usas la variable de forma global es como si no hubiese ningún concepto. Y si la variable es una expresión habría que usarla con $(NombreVariable).

En el post anterior te he puesto como crear datos de ejemplo, aunque si puedes subir la aplicación completa mejor para ver lo que intentas.

Para subir una imagen o una aplicación, al responder al post, debajo tienes una opción para subir ficheros, también arriba tienes un icono con una cámara para insertar imágenes dentro del post.

Captura.png

 

yaguilej
Contributor II
Contributor II
Author

Hola, adjunto un Word con las dos gráficas, la primera con los valores de los promedios en los intervalos, que el dato es correcto y la segunda la que he clonado sustituyendo esos valores por variables y como verás solo da el dato del primer valor. También probé con el código que tú me pasaste pero ya no encuentra nada.

Espero que con esto te puede ayudar.

Saludos