1 de mayo de 2017

Acumulados por dias

El siguiente script calcula los pagos acumulados que tiene un cliente al momento de realizar una transacción. Los campos calculados son a 1, 7, 15 y 30 días.

Conceptualmente la tabla quedaría así:












El qvd de ejemplo se puede descargar AQUI




el script:
//-- datos venta
pay:
LOAD
num(date(Floor(FechaMovimiento),'YYYYMMDD')) as fecha_num,
FechaMovimiento as fecha,  
cantidad as cant, 
user_id
FROM [c:\data\payments.qvd] (qvd);

 
//-- vector con todas las fechas
fechas: 
LOAD Distinct fecha_num 
Resident pay order by fecha_num desc; 

//-- tabla para acumular calculos
acum_tmp1: 
LOAD null() as user_id, null() as fecha 
AutoGenerate(1);

//-- para cada fecha calcula los acumulados de todos los clientes
let cant_fechas=NoOfRows('fechas'); 
for i=0 to (cant_fechas-1)   
      let vfechas = Peek('fecha_num', i, 'fechas');
  user_acum_tmp:
  LOAD
  user_id,
  fecha as fecha_pay,
  cant as cant_pay
  Resident pay Where  fecha_num = $(vfechas);
  
  Left join (user_acum_tmp) 
  LOAD user_id, fecha as fecha_fcc, cant as cant_cc 
  Resident pay 
  Where fecha_num < $(vfechas) and  fecha_num > $(vfechas) - 30;
  
  Concatenate (acum_tmp1)
  LOAD user_id, 
  fecha_pay as fecha, 
  sum(if(fecha_pay - fecha_fcc > 0 and   fecha_pay - fecha_fcc <= 1,cant_cc,0)) as acum_1d,
  sum(if(fecha_pay - fecha_fcc > 0 and  fecha_pay - fecha_fcc <= 7,cant_cc,0)) as acum_7d,
  sum(if(fecha_pay - fecha_fcc > 0 and   fecha_pay - fecha_fcc <= 15,cant_cc,0)) as acum_15d,
  sum(if(fecha_pay - fecha_fcc > 0 and fecha_pay - fecha_fcc <= 30,cant_cc,0)) as acum_30d
  Resident user_acum_tmp 
  group by user_id, fecha_pay;
  DROP Table user_acum_tmp;
NEXT

Left Join(pay) 
LOAD * Resident acum_tmp1;

DROP Table acum_tmp1;

exit script

No hay comentarios: