Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Buenos días,
tengo que resolver una cuestión que no doy con la clave: Debo obtener los cientes recuperados de un determinado año.
¿Qué se considera por recuperado? Un cliente que ha facturado en este año (2020), no en el pasado (2019) pero sí en cualquier de los 4 anteriores (2018-2015). Pero me serviría si nos acotamos con sólo 2018.
El modelo de datos tengo una tabla Clientes (IDCliente, Nombre) y Facturación anual (IDCliente, Año, Importe).
Quisiera encontrar una sentencia de SetAnalysis que me permita esto. Y si no fuera posible, supongo que se podría poner un flag en la tabla de Facturación que se llame "Recuperado": sí, no.
¿Qué me proponen? Muchas gracias.
Había hecho este set de datos, en tu tabla deberías quitar los registros donde no hubo facturación o agregar el campo en el set analysis
Cliente:
LOAD * INLINE [
IDCliente, Nombre
1, pedro
2, ana
3, pepe
4, lucia
5, rodri
];
Facturacion:
LOAD * INLINE [
IDCliente, AñoFactura
1, 2020
1, 2018
2, 2020
2, 2019
3, 2019
3, 2018
4, 2020
4, 2018
4, 2017
5, 2020
5, 2019
5, 2018
5, 2017
];
y con este Set Analisis me da el resultado deseado:
= IF((Count({1 <AñoFactura = P({1 <AñoFactura = {2018,2017} >} AñoFactura)> *
<AñoFactura = P({1 <AñoFactura = {2020} >} AñoFactura)> -
<AñoFactura = P({1 <AñoFactura = {2019} >} AñoFactura)>
} Nombre))=1,'Recuperado','')
Gracias, finalmente abordé la solución en la carga de datos del siguiente modo.
Luego con el mapping, traslado el "S" de recuperado en la tabla principal de Facturación de modo que resulta con los campos IDCliente, Ejercicio, Facturación (valor en euros), Recuperado (valor S o nulo)
temp_Facturacion:
Load * Inline [
cli_eje
AAAAA..2018
AAAAA..2019
AAAAA..2020
BBBBB..2015
BBBBB..2016
BBBBB..2017
BBBBB..2018
BBBBB..2019
BBBBB..2020
CCCCC..2016
CCCCC..2020
DDDDD..2015
DDDDD..2017
DDDDD..2018
DDDDD..2020
EEEEE..2015
EEEEE..2016
EEEEE..2017
EEEEE..2018
];
temp_Recuperados:
NoConcatenate
Load * Inline [
Clave, IDCliente, Ejercicio, Recuperado
];
Let vEje=0;
For vEje=2015 to 2020
Concatenate(temp_Recuperados)
Load
cli_eje as Clave,
SubField(cli_eje,'..',1) as IDCliente,
SubField(cli_eje,'..',2) as Ejercicio,
'S' as Recuperado
Resident temp_Facturacion
Where SubField(cli_eje,'..',2)=$(vEje)
and NOT Exists(cli_eje, SubField(cli_eje,'..',1)&'..'&($(vEje)-1))
and ( Exists(cli_eje, SubField(cli_eje,'..',1)&'..'&($(vEje)-2))
or Exists(cli_eje, SubField(cli_eje,'..',1)&'..'&($(vEje)-3))
or Exists(cli_eje, SubField(cli_eje,'..',1)&'..'&($(vEje)-4))
or Exists(cli_eje, SubField(cli_eje,'..',1)&'..'&($(vEje)-5))
);
Next
MAP_RECUPERADOS:
Mapping
Load
Clave,
Recuperado
Resident temp_Recuperados;
Con este set de datos de prueba, el resultado es el siguiente, que son los recuperados:
Tienes algún pequeño set de datos que nos puedas compartir?
No se cuántos clientes y facturas sean, pero es más eficiente calcular ésto en script que en set analysis.
Crearía una tabla de banderas que Indique si cada cliente operó o no cada año:
Cliente, F2017, F2018, F2019, F2020
A,0,0,0,1
B,1,1,0,1
O bien:
Cliente,Año,Facturó
A,2017,0
A,2018,0
A,2019,0
A,2020,1
B,2017,1
B,2018,1
B,2019,0
B,2020,1
Y así.
Ojalá te sirva.
Había hecho este set de datos, en tu tabla deberías quitar los registros donde no hubo facturación o agregar el campo en el set analysis
Cliente:
LOAD * INLINE [
IDCliente, Nombre
1, pedro
2, ana
3, pepe
4, lucia
5, rodri
];
Facturacion:
LOAD * INLINE [
IDCliente, AñoFactura
1, 2020
1, 2018
2, 2020
2, 2019
3, 2019
3, 2018
4, 2020
4, 2018
4, 2017
5, 2020
5, 2019
5, 2018
5, 2017
];
y con este Set Analisis me da el resultado deseado:
= IF((Count({1 <AñoFactura = P({1 <AñoFactura = {2018,2017} >} AñoFactura)> *
<AñoFactura = P({1 <AñoFactura = {2020} >} AñoFactura)> -
<AñoFactura = P({1 <AñoFactura = {2019} >} AñoFactura)>
} Nombre))=1,'Recuperado','')
Gracias, finalmente abordé la solución en la carga de datos del siguiente modo.
Luego con el mapping, traslado el "S" de recuperado en la tabla principal de Facturación de modo que resulta con los campos IDCliente, Ejercicio, Facturación (valor en euros), Recuperado (valor S o nulo)
temp_Facturacion:
Load * Inline [
cli_eje
AAAAA..2018
AAAAA..2019
AAAAA..2020
BBBBB..2015
BBBBB..2016
BBBBB..2017
BBBBB..2018
BBBBB..2019
BBBBB..2020
CCCCC..2016
CCCCC..2020
DDDDD..2015
DDDDD..2017
DDDDD..2018
DDDDD..2020
EEEEE..2015
EEEEE..2016
EEEEE..2017
EEEEE..2018
];
temp_Recuperados:
NoConcatenate
Load * Inline [
Clave, IDCliente, Ejercicio, Recuperado
];
Let vEje=0;
For vEje=2015 to 2020
Concatenate(temp_Recuperados)
Load
cli_eje as Clave,
SubField(cli_eje,'..',1) as IDCliente,
SubField(cli_eje,'..',2) as Ejercicio,
'S' as Recuperado
Resident temp_Facturacion
Where SubField(cli_eje,'..',2)=$(vEje)
and NOT Exists(cli_eje, SubField(cli_eje,'..',1)&'..'&($(vEje)-1))
and ( Exists(cli_eje, SubField(cli_eje,'..',1)&'..'&($(vEje)-2))
or Exists(cli_eje, SubField(cli_eje,'..',1)&'..'&($(vEje)-3))
or Exists(cli_eje, SubField(cli_eje,'..',1)&'..'&($(vEje)-4))
or Exists(cli_eje, SubField(cli_eje,'..',1)&'..'&($(vEje)-5))
);
Next
MAP_RECUPERADOS:
Mapping
Load
Clave,
Recuperado
Resident temp_Recuperados;
Con este set de datos de prueba, el resultado es el siguiente, que son los recuperados: