Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Buenas,
Tengo unas dudas acerca de como relacionar las tablas en qlikview usando join. Se que hay diferentes tipos outer join, left join, right join e inner join.
Intento explicar mi problema, para ver si me logran dar alguna idea. Yo creo una tabla en la que tengo diferentes campos: clave, ID1,ID2, campo1,campo2, etc
Esa tabla(Tabla1) sale de un fichero que leo, en ocasiones el registro trae ID1 y en otras ID2
clave ID1 ID2
clave1 15 -
clave2 - 30
clave3 20 -
Entonces yo tengo otra tabla (Tabla2) donde consigo que los ID1 tengan asoaciado un ID2
ID1 ID2
15 22
20 40
La tabla que yo quiero conseguir finalmente es la siguiente:
clave ID1 ID2
clave1 15 22
clave2 - 30
clave3 20 40
Entonces mi problema se resume en el siguiente, yo quiero que la tabla1 se relacione con la tabla2, pero que lo haga solo a traves del ID1, para mi no tiene sentido que aunque en tabla1 tenga un ID2 = 30, me los relacione , con aquellos que en tabla2 tenga ID2 = 30. ¿Hay alguna forma que habiendo como en este caso 2 campos por los cuales se puede hacer el join restringir a que lo haga solo por uno?
Me vendría bien cualquier ayuda....llevo unos días con esto en la cabeza y no acabo de ver como solucionarlo
Un saludo
Hola Jonay:
Te paso un enlace a un documento con todos los posibles tipos de JOIN
Saludos
Joaquín
Hola Jonay, podrías usar ApplyMap, carga primero como tabla de mapeo la que relaciona ID1 con ID2, luego en la tabla que carga los datos solo tienes que comprobar que ID2 tenga datos, si no los tiene usas el applymap:
MAP_ID1_ID2:
Mapping LOAD ID1, ID2
FROM....
Data:
LOAD Clave, ID1, If(IsNull(ID2), ApplyMap('MAP_ID1_ID2', ID1, Null()), ID2) as ID2
FROM ...
Buenas Ruben,
Se me olvido comentar una cosa....que rompe tú solución....sino sería perfecta Se trata de lo siguiente, cada ID1 puede tener diferentes ID2, si aplico esta solución que me comentas solo aplica evidentemente un valor de mapeo, y no se que criterio sigue, si el primero, el último que encuentra o que ....pero no lo hace... Sino la solución seria perfecta....
¿Alguna forma de reciclar esta solución?
Muchas gracias, por la ayuda
Buenas Jonay, ApplyMap recuperaría la primera coincidencia que encuentre en la tabla de mapeo.
Me faltaría saber requisitos para plantear la solución correcta pero por poner una opción:
- Cargar el campo ID1 de la primera tabla con "Where not IsNull(ID1)"
- Hacer un Left Join (Tabla1) LOAD * FROM tabla2;
- Concatenar al resultado la primera tabla, con "Where Isnull(ID1)"
- ...Igual hace falta algún ajuste más
Aunque no lo he probado, creo que también se podría usar la opción de applymap si creas la tabla de mapeo con los diferentes valores:
MAP_ID1_ID2:
Mapping LOAD ID1, Concat(ID2, '#')
FROM....
Group by ID1;
Data:
LOAD Clave, ID1, If(IsNull(ID2), Subfield(ApplyMap('MAP_ID1_ID2', ID1, Null()), ID2), '#') as ID2
FROM ...
Jonay, si no eres capaz de marcar un registro para poder hacer el mapping usa OUTER JOIN ... entonces tendrás todos los valores ID1-ID2 asociados a cada clave.
Habría que tener en cuenta que si se usa un join va a tener en cuenta el campo ID2, así que asignaría a Tabla1 todos los ID1 que encuentren coincidencia en el campo ID2. Si esto no es un problema lo más fácil sería lo que dice Joaquín.
Por cierto que había un error en mi último post, sería:
Data:
LOAD Clave, ID1, If(IsNull(ID2), Subfield(ApplyMap('MAP_ID1_ID2', ID1, Null()), '#'), ID2) as ID2
FROM ...
Otra cosa que se me ocurre es que hagas la carga en dos pasos,
1) El primero con un WHERE ID2 <> Null (la sintaxis depende de tu SQL)
2) El segundo con un WHERE ID2 = Null y el applymap para obtener el ID2 si eres capaz de establecer una relación uno a uno entre ID1 e ID2 o con un join si es uno a varios
Buenas,
Al final creo que mi problema se simplifica, y puedo llegar al caso que para cada ID1 solo haya un ID2, y por tanto creo que podría aplicar la opción del mapeo. En cuanto compruebe que la cosa funcione bien, cierro el tema. Muchas gracias a ambos por la ayuda