Skip to main content
Announcements
Introducing Qlik Answers: A plug-and-play, Generative AI powered RAG solution. READ ALL ABOUT IT!
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

19 Replies
etendero
Partner - Creator
Partner - Creator

Entonces podrías quitar al ID_Vendedor del Group By para que no afecte el vendedor en los cálculos.

Not applicable
Author

¿En que group by?  para el calculo del intervalo entre pedidos no hay ninguno...  

etendero
Partner - Creator
Partner - Creator

El Group By que te puse en la tabla Pedidos_aux de la respuesta Re: Intervalos entre fechas de pedido, a no ser que te haya entendido mal el último problema que me has comentado.

Not applicable
Author

¿Te refieres al order by?

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;

Not applicable
Author

También he detectado que se me duplican las fechas, apareciendo una con la diferencia de días entre pedidos y la otra a 0:

                                                                                                      

ID_VENDEDOR
  - ID_CLIENTE
FECHADIAS DISTANCIA
000044-02270924/06/14-542
000044-02270924/06/140
000044-02270918/12/130
000044-02270918/12/136
000044-02270912/12/130
000044-02270912/12/1364
000044-02270909/10/130
000044-02270909/10/13125
000044-02270906/06/130
000044-02270906/06/1376
000044-02270922/03/130
000044-02270922/03/1355
000044-02270927/01/13-634
000044-02270927/01/130
000044-02270922/10/120
000044-02270922/10/1248
000044-02270904/09/120
000044-02270904/09/1276
000044-02270920/06/120
000044-02270920/06/1247
etendero
Partner - Creator
Partner - Creator

Disculpa Juan Antonio, cuando te escribí el primer código, quise poner Group By en vez de Order By. Mi intención era la de quitar los repetidos y dejar las combinaciones de ID_CLIENTE, ID_VENDEDOR y FECHA_PEDIDO diferentes. Por lo tanto, me refería a que hicieras el Group By ID_CLIENTE, FECHA_PEDIDO porque al quitar el ID_VENDEDOR, te aparecen las fechas de pedido independientemente del vendedor.

Un saludo y disculpa una vez más por la confusión.

Not applicable
Author

Hola Emilio.

Pero al no tener ninguna agregación, ¿funcionaria el group by?

etendero
Partner - Creator
Partner - Creator

Como lo estamos montando en el script, con un Group By no hace falta una función de agregación como tal, con utilizar algún tipo de formula u operación es suficiente. Mi propuesta quedaría de la siguiente forma:

PedidosClientes:

LOAD

  , ID_CLIENTE

  , FECHA_PEDIDO

  , Autogenerate(ID_CLIENTE & '-' & FECHA_PEDIDO) as ID_PedidosClientes

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

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

  as DIAS_DISTANCIA

Resident Pedidos

Group by ID_CLIENTE, FECHA_PEDIDO;

Inner Join(Pedidos)

LOAD ID_PedidosClientes

  , DIAS_DISTANCIA

Resident PedidosClientes

Where DIAS_DISTANCIA > 365

DROP Table PedidosClientes;

He modificado algo más la propuesta para adaptarlo un poco más, dentro de mi desconocimiento de tu modelo de datos. Ahora utilizo un Inner Join para reducir tu tabla de pedidos. He generado una clave única con ID_CLIENTE y FECHA_PEDIDO para que no te cree una tabla sintética. Tendrás que añadir esa clave única también en tu tabla de Pedidos para que funcione la relación.

Un saludo.

Not applicable
Author

Hola Emilio.


Ya logre hacerlo funcionar. Finalmente el código ha quedado se esta manera:

DISTANCIA_ENTRE_PEDIDOS:
LOAD

ID_VENDEDOR,
ID_CLIENTE,
FECHA_PEDIDO,

SUM((DAYNUMBEROFYEAR(FECHA_PEDIDO) + ((YEAR(FECHA_PEDIDO)-(YEAR(TODAY()))) * 365))
-
(DAYNUMBEROFYEAR(PREVIOUS(FECHA_PEDIDO))+((YEAR(PREVIOUS(FECHA_PEDIDO))-YEAR(TODAY())) * 365))) AS DIAS_ENTRE_PEDIDOS,

NUM((DAYNUMBEROFYEAR(TODAY())) 
-
(DAYNUMBEROFYEAR(FECHA_PEDIDO) + ((YEAR(FECHA_PEDIDO)-YEAR(TODAY() )) * 365))) AS DIAS_HASTA_HOY

RESIDENT PEDIDOS

GROUP BY ID_VENDEDOR, ID_CLIENTE, FECHA_PEDIDO;

He modificado la parte en la que calculábamos el decalaje del año, haciendo que el año del pedido menos el año del hoy.

Por otra parte he calculado el numero de días con respecto a hoy de cada pedido.

De esta manera podre ver el numero de días a cada pedido y la distancia entre ellos.

Muchisimas gracias por tu ayuda Emilio. Ha sido la típica cosa que sobre el papel no parecía complicada de calcular, pero al final ha llevado su tiempo.

Un saludo

etendero
Partner - Creator
Partner - Creator

Me alegro de que lo hayas conseguido.

Un saludo.