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

Intervalos entre fechas de pedido

Hola a todos, la cuestión es la siguiente:

Tengo una tabla con tres campos:  ID_CLIENTE, ID_VENDEDOR, FECHA_PEDIDO.

Lo que necesito hacer es calcular, en script,  para cada vendedor qué clientes han hecho un pedido habiendo pasado un año o mas de su anterior pedido.

Aún no he encontrado una manera de calcularlo eficientemente.

¿Me echais una manilla?

Muchas gracias

1 Solution

Accepted Solutions
etendero
Partner - Creator
Partner - Creator

Tienes razón,

La solución que planteas es correcta, siempre y cuando sólo tengas un histórico de 3 años como dices y que la fecha del pedido anterior no caiga en otro año.

Una solución para que contemple estos casos también, podía ser la siguiente:

, (DayNumberOfYear(FECHA_PEDIDO)            + (((Year(Today()) - Year(FECHA_PEDIDO))           * 365))

- (DayNumberOfYear(Previous(FECHA_PEDIDO))  + (((Year(Today()) - Year(Previous(FECHA_PEDIDO))) * 365))

  as DIAS_DISTANCIA

Un saludo.

View solution in original post

19 Replies
etendero
Partner - Creator
Partner - Creator

Hola Juan Antonio,

Pues se me ocurre lo siguiente:

Pedidos_aux:

LOAD ...

  , ID_CLIENTE

  , ID_VENDEDOR

  , FECHA_PEDIDO

  , DayNumberOfYear(FECHA_PEDIDO) - DayNumberOfYear(Previous(FECHA_PEDIDO)) as DIAS_DISTANCIA

Resident Pedidos

Order by ID_CLIENTE, ID_VENDEDOR, FECHA_PEDIDO;

DROP Table Pedidos;

Pedidos:

LOAD *

Resident Pedidos_aux

Where DIAS_DISTANCIA > 365

DROP Table Pedidos_aux;

Evidentemente, habrá que adaptarlo a tu modelo de datos.

Un saludo y espero haberte ayudado.

Not applicable
Author

Hola Emilio.

Muy buena propuesta, además de resolver esta situación de una manera muy eficaz, me ha ayudado a mejorar otros cálculos.  Con estos tres campos (id_cliente, fecha_pedido, id_vendedor) la idea es calcular una serie de indicadores como:

- Tasa de recuperación de cliente:  % de clientes que han hecho un pedido y hacia mas de un año que no lo hacían

- Tasa de perdida de clientes: % de clientes que hace mas de un año que no hacen un pedido.

- Tasa de adquisición: % Clientes que han realizado un cliente por primera vez

¿Se te ocurre como calcular la tasa de adquisición? Yo había pensado en hacer un count(fecha_pedido) para tener el total pedidos realizados, y si al restar el numero de pedidos en el periodo de análisis (mes, trimestre, etc)  y el total de pedidos realizados el resultado es 0, entonces lo consideraría cliente nuevo.

¿Cómo lo ves?

Un saludo

Not applicable
Author

Emilio: Me estoy dando cuenta de que al tener un histórico de pedidos de 3 años, tendría que realizar algún apaño del tipo:

left join (Pedidos)
Load
FECHA_PEDIDO,
if(year(FECHA_PEDIDO)= year (today()),0 ,
   
if(year(FECHA_PEDIDO)= year (today())-1,365,
      
if(year(FECHA_PEDIDO)= year (today())-2,730 ) )) AS DECALAJE
resident Pedidos;  

Pedidos_aux:

LOAD ...

  , ID_CLIENTE

  , ID_VENDEDOR

  , FECHA_PEDIDO

  , (DayNumberOfYear(FECHA_PEDIDO) + DECALAJE) -  (DayNumberOfYear(Previous(FECHA_PEDIDO)+DECALAJE)) as DIAS_DISTANCIA

Resident Pedidos

Order by ID_CLIENTE, ID_VENDEDOR, FECHA_PEDIDO;

DROP Table Pedidos;

Pedidos:

LOAD *

Resident Pedidos_aux

Where DIAS_DISTANCIA > 365

DROP Table Pedidos_aux;

¿Como lo ves?

etendero
Partner - Creator
Partner - Creator

Hola, me alegro que te haya servido.

Se me ocurriría algo similar a lo que planteas, siempre que te haya entendido bien. Escrito rápidamente y sin probar, para sacar el porcentaje, sería algo como:

Count(DISTINCT if( Count(TOTAL Fecha_Pedido) = 1, ID_Cliente)

/

Count(DISTINCT ID_Cliente)

¿verdad?

Un saludo.

etendero
Partner - Creator
Partner - Creator

Tienes razón,

La solución que planteas es correcta, siempre y cuando sólo tengas un histórico de 3 años como dices y que la fecha del pedido anterior no caiga en otro año.

Una solución para que contemple estos casos también, podía ser la siguiente:

, (DayNumberOfYear(FECHA_PEDIDO)            + (((Year(Today()) - Year(FECHA_PEDIDO))           * 365))

- (DayNumberOfYear(Previous(FECHA_PEDIDO))  + (((Year(Today()) - Year(Previous(FECHA_PEDIDO))) * 365))

  as DIAS_DISTANCIA

Un saludo.

Not applicable
Author

Pensaba que al calcular el campo DECALAJE  si funcionaria, aunque me doy cuenta de que debería de calcularlo de la siguiente manera:

left join (Pedidos)
Load
FECHA_PEDIDO,
if(year(FECHA_PEDIDO)= year (today()), 730 ,
   
if(year(FECHA_PEDIDO)= year (today())-1,365,
      
if(year(FECHA_PEDIDO)= year (today())-2, 0 ) )) AS DECALAJE
resident Pedidos;  

Asi un pedido del 6/12/2014 tendría como dia del año ( 6 ) + decalaje ( 730 )  = 736 y un pedido del 30/12/2013  tendría como dia ( 364 ) + decalaje  ( 365 )=  729 , siendo asi la distancia entre pedidos de 7 días, por lo que aparentemente si funciona .

etendero
Partner - Creator
Partner - Creator

Pero el DECALAJE lo estás calculando sobre la FECHA_PEDIDO, entonces le vas a aplicar el mismo DECALAJE tanto a FECHA_PEDIDO como a Previous(FECHA_PEDIDO) y no uno distinto a cada uno. Tu ejemplo sería:

Asi un pedido del 6/12/2014 tendría como dia del año ( 6 ) + decalaje ( 730 ) = 736 y un pedido del 30/12/2013 tendría como dia ( 364 ) + decalaje ( 365 730 ) =  729 1094, siendo así la distancia entre pedidos de 7 358 días, por lo que aparentemente si NO funciona.

Un saludo.

Not applicable
Author

Tienes Razón. No había caído en que el decalaje se aplica únicamente a la fecha del pedido. Voy a ejecutar con la solución que me indicabas. Y luego a probar el tema de la tasa de adquisición, que aun no me he metido con ello.

gracias de nuevo.  

Not applicable
Author

Analizando y validando resultados, he caído en la cuenta de que un mismo cliente puede ser trabajado por varios vendedores, por lo que habría que controlar que se calcule el intervalo entre pedidos de cada vendedor en el mismo cliente.

Se me ocurre hacer un bucle variando el vendedor en cada pasada, pero me temo que podría ser bastante ineficaz.