Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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:
Cliente | Productos vendidos | Productos no vendidos |
---|---|---|
C1 | P1,P2 | P3,P4 |
C2 | P3 | P1,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.
Hola,
La única forma que encontré para resolver tu pregunta fue hacer lo siguiente:
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',
))))))))))
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.
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 ...
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.
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:
Espero que eso si te ayude.
Saludos,
Diego Aparicio.
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.
Con Mucho Gusto Marcelo, de todas maneras si encuentra alguna forma de hacerlo, me cuenta porque es bueno saber diferentes alternativas!