Qlik Community

Mexico

Announcements
QlikWorld 2022, LIVE in Denver CO., May 16-19, 2022. REGISTER NOW TO RECEIVE EARLY BIRD PRICING
cancel
Showing results for 
Search instead for 
Did you mean: 
jordimtb
Contributor III
Contributor III

Obtener número de clientes recuperados

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.

Labels (2)
2 Solutions

Accepted Solutions
adriansalas
Contributor III
Contributor III

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','')

View solution in original post

jordimtb
Contributor III
Contributor III
Author

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:

 

View solution in original post

4 Replies
adriansalas
Contributor III
Contributor III

Tienes algún pequeño set de datos que nos puedas compartir?

amonjaras
Partner
Partner

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.

adriansalas
Contributor III
Contributor III

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','')

View solution in original post

jordimtb
Contributor III
Contributor III
Author

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:

 

View solution in original post