Skip to main content
Announcements
NEW: Seamless Public Data Sharing with Qlik's New Anonymous Access Capability: TELL ME MORE!
cancel
Showing results for 
Search instead for 
Did you mean: 
jmmayoral3
Creator
Creator

set análisis para registros individuales

Tengo una tabla de ventas artículos con su fecha, unidades vendidas y un campo que indica si ese día hubo rotura de stock o no. (1, hubo, 0 no hubo)
El usuario puede elegir un rango de fechas y debo obtener un gráfico de tabla con 2 columnas: el artículo y el nº de días de rotura de stock posteriores a la primera fecha de venta dentro del rango elegido.

LOAD * INLINE [
articulo, día, ventas, dia_rotura_stock
A , 01/04/2023, 0 , 1
A , 02/04/2023, 0 , 1
A , 03/04/2023, 20 , 0
A , 04/04/2023, 3 , 0
A , 06/04/2023, 0 , 1
A , 07/04/2023, 0 , 1
A , 08/04/2023, 5 , 0
A , 09/04/2023, 0 , 0
A , 10/04/2023, 3 , 1
B , 01/04/2023, 3 , 0
B , 02/04/2023, 0 , 1
B , 03/04/2023, 0 , 1
B , 04/04/2023, 0 , 1
B , 06/04/2023, 0 , 1
B , 07/04/2023, 0 , 1
B , 08/04/2023, 0 , 1
B , 09/04/2023, 3 , 0
B , 10/04/2023, 0 , 0
];


Suponiendo que el usuario elige desde el día 04/04/2023 al 10/04/2023 (ambos incluidos) en resultado debería ser:

artículo       Días rotura
A                             3
B                             0

En el caso el artículo A hay varias fechas de venta, pero la más pequeña dentro del periodo es el 04/04/2023. A partir de ahí contamos los días con rotura de stock hasta el 10/04/2023 (fecha final del periodo seleccionado por el usuario) y el recuento da 3.

En el caso del artículo B la fecha con ventas más pequeña dentro del periodo es el 09/04/2023 (el 01/04/2023 está fuera del periodo) y desde ahí al final no hay ningún día de rotura de stock, por lo tanto es 0.

Estoy usando esta expresión para el conteo:
sum({<día={">=$(=MIN({<ventas={">0"}>} día))"}>} dia_rotura_stock)

Pero el resultado que me devuelve es:
artículo          Días rotura
A                                3
B                               4

El Set analysis devuelve la fecha menor de venta de los 2 artículos en conjunto ( o sea, 04/04/2023), no la menor de cada uno de ellos, y desde ese día el artículo B ha tenido 4 días de rotura de stock, lo que es erróneo porque debería ser 0.

¿Como se puede solucionar?
¿Cómo hacer que tome la fecha mínima de cada artículo para que de el resultado correcto?

Gracias

1 Solution

Accepted Solutions
rubenmarin

Hola, los $(=...) se expanden antes de calcula la tabla, por lo que no aplica dimensiones. Para evitar esto se puede usar aggr() para calcular por artículo (y porque no se pueda usar Min directamente en un Sum), y un if() para hacer la comparación teniendo en cuenta las dimensiones.

sum(aggr(If(dia>=Min(TOTAL <articulo> {<ventas={">0"}>} dia), dia_rotura_stock),articulo,dia))

Creo que funcionará pero falta ver el rendimiento que tiene con los datos reales.

Saludos.

View solution in original post

1 Reply
rubenmarin

Hola, los $(=...) se expanden antes de calcula la tabla, por lo que no aplica dimensiones. Para evitar esto se puede usar aggr() para calcular por artículo (y porque no se pueda usar Min directamente en un Sum), y un if() para hacer la comparación teniendo en cuenta las dimensiones.

sum(aggr(If(dia>=Min(TOTAL <articulo> {<ventas={">0"}>} dia), dia_rotura_stock),articulo,dia))

Creo que funcionará pero falta ver el rendimiento que tiene con los datos reales.

Saludos.