Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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
Entonces podrías quitar al ID_Vendedor del Group By para que no afecte el vendedor en los cálculos.
¿En que group by? para el calculo del intervalo entre pedidos no hay ninguno...
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.
¿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;
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 | FECHA | DIAS DISTANCIA |
000044-022709 | 24/06/14 | -542 |
000044-022709 | 24/06/14 | 0 |
000044-022709 | 18/12/13 | 0 |
000044-022709 | 18/12/13 | 6 |
000044-022709 | 12/12/13 | 0 |
000044-022709 | 12/12/13 | 64 |
000044-022709 | 09/10/13 | 0 |
000044-022709 | 09/10/13 | 125 |
000044-022709 | 06/06/13 | 0 |
000044-022709 | 06/06/13 | 76 |
000044-022709 | 22/03/13 | 0 |
000044-022709 | 22/03/13 | 55 |
000044-022709 | 27/01/13 | -634 |
000044-022709 | 27/01/13 | 0 |
000044-022709 | 22/10/12 | 0 |
000044-022709 | 22/10/12 | 48 |
000044-022709 | 04/09/12 | 0 |
000044-022709 | 04/09/12 | 76 |
000044-022709 | 20/06/12 | 0 |
000044-022709 | 20/06/12 | 47 |
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.
Hola Emilio.
Pero al no tener ninguna agregación, ¿funcionaria el group by?
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.
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
Me alegro de que lo hayas conseguido.
Un saludo.