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

Ayuda set analisys

Hola a todos, quería saber si alguien me puede ayudar con lo siguiente:

Tengo 4 clientes:

C1, C2, C3, C4

a los cuales les ofrezco  4 productos:

P1, P2, P3, P4

Finalmente se producen las siguientes ventas:

Al cliente C1 le he vendido los productos P1 y P2

Al cliente C2 le he vendido el producto P3

Este es el script:

Clientes:

LOAD * INLINE [

    CodigoCliente

    C1

    C2

    C3

    C4

];

Productos:

LOAD * INLINE [

    CodigoProducto

    P1

    P2

    P3

    P4

];

Ventas:

LOAD * INLINE [

    CodigoCliente, CodigoProducto

    C1, P1

    C1, P2

    C2, P3

];

Quiero mostrar, por cada cliente, tanto lo que se le ha vendido como lo que no se le ha vendido.

En un gráfico de tabla simple, quiero poner como dimensión el cliente, una expresión que muestre los productos vendidos (separados por coma) y otra expresión que muestre los productos no vendidos (separados por coma).

Adjunto el documento.

Agradecería si alguien me puede ayudar.

Querría un resultado como este:

ClienteProductos vendidosProductos no vendidos
C1P1,P2P3,P4
C2P3P1,P2,P4
C3-P1,P2,P3,P4
C4-P1,P2,P3,P4

La expresión para los productos vendidos me funciona correctamente y es la siguiente:

Concat(DISTINCT CodigoProducto, ',')

Me falta la expresión para los productos no vendidos.

6 Replies
Not applicable
Author

Hola,

La única forma que encontré para resolver tu pregunta fue hacer lo siguiente:

Captura Preg IF 1.PNG.png

If(Concat(DISTINCT CodigoProducto, ',') = 'P1', 'P2,P3,P4',

If(Concat(DISTINCT CodigoProducto, ',') = 'P2', 'P1,P3,P4',

If(Concat(DISTINCT CodigoProducto, ',') = 'P3', 'P1,P2,P4',

If(Concat(DISTINCT CodigoProducto, ',') = 'P4', 'P1,P2,P3',

If(Concat(DISTINCT CodigoProducto, ',') = 'P1,P2', 'P3,P4',

If(Concat(DISTINCT CodigoProducto, ',') = 'P1,P3', 'P2,P4',

If(Concat(DISTINCT CodigoProducto, ',') = 'P1,P4', 'P2,P3',

If(Concat(DISTINCT CodigoProducto, ',') = 'P2,P3', 'P1,P4',

If(Concat(DISTINCT CodigoProducto, ',') = 'P2,P4', 'P1,P3',

If(Concat(DISTINCT CodigoProducto, ',') = 'P3,P4', 'P1,P2',

))))))))))

Captura Preg IF.PNG.png

Me faltaron muchas mas combinaciones, pero para tu duda específica la puedo resolver, sin embargo para poner todas las combinaciones posibles tocaría saber si la data de la tabla ventas está ordenada.

Ahora, no se si de pronto realizando una cross table y usando dicha tabla, podríamos eliminar tanto IF.

Saludos,

Diego.

Not applicable
Author

Gracias por tu respuesta Diego.

Lo que ocurre es que he utilizado unos datos simulados para facilitar el ejemplo. En los datos de producción hay mas cantidad de registros.

He estado intentando hacerlo con set analisys pero no lo consigo ...

Not applicable
Author

Ok, voy a intentar lo que te dije de crear una tabla con las combinaciones porque no veo como hacerlo con set analysis y si encuentro algo te cuento.

Saludos.

Not applicable
Author

Hola Marcelo,

Le trabaje un rato al tema como te dije, pero no lo resolví con Set Analisys sino haciendo un producto cartesiano y luego a partir de ese producto cartesiano y la tabla de ventas genero los cruces de los productos no vendidos, este es el código para guardar los datos:

SET vFilesQVD = 'D:\QlikView\Bodega QVD\';

Clientes:

LOAD * INLINE [

    CodigoCliente

    C1

    C2

    C3

    C4

];

Productos:

LOAD * INLINE [

    CodigoProducto

    P1

    P2

    P3

    P4

];

Ventas:

LOAD * INLINE [

    CodigoCliente, CodigoProducto

    C1, P1

    C1, P2

    C2, P3

];

STORE Ventas Into  $(vFilesQVD)VentasInvento.qvd(qvd);

Temp:

NoConcatenate LOAD CodigoCliente as CodigoCliente Resident Clientes;

Join(Temp) LOAD CodigoProducto as CodigoProducto1 Resident Productos;

STORE Temp Into $(vFilesQVD)ProductoCartes.qvd(qvd);

Drop Table Temp;

Drop Table Ventas;

Totales:

LOAD CodigoCliente, CodigoProducto, CodigoCliente&''&CodigoProducto as Concatenacion

From  $(vFilesQVD)VentasInvento.qvd(qvd);

NoConcatenate LOAD CodigoCliente, CodigoProducto1, CodigoCliente&''&CodigoProducto1 as Concatenacion

From $(vFilesQVD)ProductoCartes.qvd(qvd);

Ya Con esto tienes una tabla con las tres columnas, una columna de productos que es la original de la tabla ventas y otra con la información del cruce (Te puse en rojo lo nuevo que incluí). Me toco poner la concatención al final para lograr el resultado esperado.

Ahora creas tu tabla sencilla y le das las siguientes fórmulas:

Productos_Vendidos: Concat(DISTINCT CodigoProducto, ',')

Productos_No_Vendidos: Concat(DISTINCT if(CodigoProducto1 = CodigoProducto, null(), CodigoProducto1), ',')

Con esto el resultado de la tabla es el siguiente:

Captura Preg IF 2.PNG.png

Espero que eso si te ayude.

Saludos,

Diego Aparicio.

Not applicable
Author

Hola Diego, muchas gracias por la solución que propones.

Creo que es la única forma de hacerlo, ya que he estado mirando set analysis y por lo que he leído no se puede resolver utilizando filtros.

Tendría que ver el producto cartesiano cuantos registros genera para ver si es factible.

Gracias por el tiempo que has dedicado y un saludo.

Not applicable
Author

Con Mucho Gusto Marcelo, de todas maneras si encuentra alguna forma de hacerlo, me cuenta porque es bueno saber diferentes alternativas!