Skip to main content
Announcements
See why Qlik is a Leader in the 2024 Gartner® Magic Quadrant™ for Analytics & BI Platforms. Download Now
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

dudas haciendo join

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

8 Replies
JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Jonay:

Te paso un enlace a un documento con todos los posibles tipos de JOIN

JOIN sample

Saludos

Joaquín

rubenmarin

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 ...

Anonymous
Not applicable
Author

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

rubenmarin

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 ...

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

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.

rubenmarin

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 ...

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

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

Anonymous
Not applicable
Author

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