Skip to main content
Announcements
Join us at Qlik Connect for 3 magical days of learning, networking,and inspiration! REGISTER TODAY and save!
cancel
Showing results for 
Search instead for 
Did you mean: 
jorge_redondo
Contributor III
Contributor III

Cómo relacionar estas tablas?

Hola!

Tengo un problema a la hora de cargar varias tablas de procedentes de una aplicación contable.

El caso es que no doy con la sentencia SQL SELECT para conseguir el resultado que intento describir a la derecha de la imagen. A pesar de que cuento en ambas tablas (IVA y DIARIO) con un campo común (ID_IVA), el problema es que, los campos que necesito unir al resultado final figuran en otra fila distinta a la de la clave ID_IVA. No sé si he conseguido explicarme bien, espero que con el esquema se pueda entender.

Alguna pista? Gracias de antemano!!

Libro18 - Excel_2019-02-01_16-54-59.jpg

2 Solutions

Accepted Solutions
rubenmarin

hOLA joRGE,

Enla tabla Diario tienes una fila que tiene relacion con la tabla IVA, otra con DPTO y SUBDPTO, y otra sin relaciones, par unir todo en una fila tendrías que crear la fila con todas las claves antes de hacer los join, por ejemplo:
DIARIO:
LOAD ASIENTO,
MAX(ID_IVA) as IVA,
MAX(ID_DPT) as DPT,
MAX(ID_SDPT) as SDTP
From [OrigenDiario]
group by ASIENTO;

Left Join LOAD * From [OrigenIVA];
Left Join LOAD * From [OrigenDPTO];
Left Join LOAD * From [OrigenSDPTO];

View solution in original post

rubenmarin

Habría varias formas, una podría ser tener una tabla donde se vayan añadiendo los datos de cada empresa:
// Inicializar tabla
TablaFinal: LOAD * Inline [dumbField]

// Carga Empresa1 con todos los joins
...
// Añadir tabla Empresa1 a TablaFinal y borrar
Concatenate (TablaFinal) LOAD *, 'Empresa-1' as Empresa resident TablaEmpresa1;
DROP table TablaEmpresa1;

// Carga Empresa2 con todos los joins
...
// Añadir tabla Empresa2 a TablaFinal y borrar
Concatenate (TablaFinal) LOAD *, 'Empresa-2' as Empresa resident TablaEmpresa2;
DROP table TablaEmpresa2;

También se podría usar un for each y usar variables:
For each vEmpresa in '300','400'
ODBC CONNECT32 TO [MS Access Database;DBQ=C:\Contasol\Datos\$(vEmpresa )2019.MDB];

// Carga vEmpresa con todos los joins
...
// Añadir a TablaFinal y borrar
Concatenate (TablaFinal) LOAD *, '$(vEmpresa)' as Empresa resident tmpEmpresa;
DROP table tmpEmpresa;

Next

View solution in original post

11 Replies
carlosrb1978
Creator
Creator

Hola Jorge

No se cual estarás usando si el Sence o el View, pero en Qlikview, basta y sobra que los campos de las distintas tablas tengan el mismo nombre para que se relaciones, en caso desees que estas se junten en una sola tabla deberás aplicar el Join , mira la imagen que adjunto con ello podrás tener una idea de como relacionar las tablas

Captura.JPG

jorge_redondo
Contributor III
Contributor III
Author

Bien, esta consulta me da la vista que perseguía:

SELECT a.id_iva, i.cuenta, i.total, d.descripcion AS departamento, s.descripcion AS subdepartamento
FROM(SELECT asiento, MAX(id_iva) AS id_iva, MAX(id_departamento) AS id_dep, MAX(id_subdepartamento) AS id_sub FROM apuntes
GROUP BY asiento) AS a
LEFT JOIN Iva AS i ON a.id_iva = i.id_iva
LEFT JOIN departamentos AS d ON id_dep = d.id_departamento
LEFT JOIN subdepartamento AS s ON id_sub=s.id_subdepartamento
WHERE a.id_iva > 0
GROUP BY a.id_iva

El problema es que no sé cómo llevarlo al los LOAD de las tablas.

jorge_redondo
Contributor III
Contributor III
Author

He intentado hacer la carga de las 4 tablas pero no hay manera, ando perdido... Con la consulta consigo "aplanar" la tabla apuntes (diario en mi esquema) pero no sé cómo hacer que funcione en el LOAD del script. Como digo, la consulta funciona y me da el resultado que busco, pero necesito "traducirla" correctamente a la sintaxis de Qlikview.

Cualquier ayuda será bienvenida!

carlosrb1978
Creator
Creator

Bueno lo que tendrías que hacer es cargar la primera tabla

 

// aca cargas la primera tabla

TABLA_MAESTRA:

Load

*

From [ruta y nombre del primer archivo] (qvd);

 

// acá unes la segunda tabla con la primera

Left join (TABLA_IVA)

*

From [ruta y nombre de l segundo archivo] (qvd);

 

// acá unes con la tercera tabla

Left Join (TABLA_IVA)

*

From [ruta y nombre del tercer archivo] (qvd);

 

// acá unes la cuarta tabla

Left Join (TABLA_IVA)

*

From [ruta y nombre del cuarto archivo] (qvd);

 

// Al final te quedara la tabla 'TABLA_MAESTRA', LA CUAL contendrá la información de los 4 archivos.

 

Ojala te pueda ayudar en algo

jorge_redondo
Contributor III
Contributor III
Author

Gracias, pero no es la solución. Además de usar el Join, tengo un problema con la tabla Diario, la cuál tiene clave compartida con la tabla IVA a través de la clave ID_Iva, pero necesito hacer un join también a través de IDDepartamento y IDSubdepartamento en cuyas filas siempre saldrá ID_Iva a "0". Lo que vengo a necesitar básicamente es cómo "traducir" esta sentencia SQL  que puse más arriba unas sentencias LOAD. Sobre todo la subconsulta.

Por cierto, estoy usando ODBC, leo las tablas de una base Access.

 

 

 

jmmayoral3
Creator
Creator

Hola Jorge.

Como te dice Carlos, puedes cargar las tablas individualmente sin necesidad de hacer una select compleja. QlikView (o Sense) ya se encarga de unir las tablas por le nombre del campo. Luego puedes usar los campos individuales para hacer tu presentación de la derecha sin necesidad de hacer joins complejos.

En cuanto a cargar de access, basta con elegir el driver específico. Tienes que elegir el driver OLDB    "Micosoft Jet 4.0 OLE DB Provider" de 32 bits

jorge_redondo
Contributor III
Contributor III
Author

Gracias. Lo cierto es que cargando las tablas normalmente no funciona. La tabla diario se compone de grupos de registros con el mismo número de asiento, en uno de esos registros, figura el id_iva que se relaciona con la tabla IVA, pero en los otros dos registros que conforman el asiento en la tabla diario, el id_iva=0. Lo mismo pasa con el departamento y subdpt., 

Subo el qwv para que se pueda entender mejor. Creo que el load debería incluir una subconsulta o algo parecido, pero no sé cómo implementarlo. La sentencia SQL que puse arriba, como digo, me da la vista que necesito, es decir, mostrar la tabla IVA con su departamento y sudbdepartamento correspondiente.

Gracias por vuestro interés.

rubenmarin

hOLA joRGE,

Enla tabla Diario tienes una fila que tiene relacion con la tabla IVA, otra con DPTO y SUBDPTO, y otra sin relaciones, par unir todo en una fila tendrías que crear la fila con todas las claves antes de hacer los join, por ejemplo:
DIARIO:
LOAD ASIENTO,
MAX(ID_IVA) as IVA,
MAX(ID_DPT) as DPT,
MAX(ID_SDPT) as SDTP
From [OrigenDiario]
group by ASIENTO;

Left Join LOAD * From [OrigenIVA];
Left Join LOAD * From [OrigenDPTO];
Left Join LOAD * From [OrigenSDPTO];
jorge_redondo
Contributor III
Contributor III
Author

Muchas gracias Rubén, ahí estaba el quiz.. en "aplanar" los asientos en la tabla Diario. Intentándolo hacer, me daba errores en la sintaxis, al final quedó así y funciona ok.

 

ODBC CONNECT32 TO [MS Access Database;DBQ=C:\Contasol\Datos\4002019.MDB];

DIARIO:
SELECT
	ASIAPU	as Asiento,
	MAX(CIVAPU)	 as ID_Iva,
	MAX(DEPAPU) as IDDepartamento,
	MAX(SUBAPU) as IDSubdepartamento
	
  	FROM F_APU WHERE YEAR(FECAPU)=2019 GROUP BY ASIAPU;

IVA:
LEFT JOIN (DIARIO)
LOAD	
	CODIVS						as ID_Iva,
	FECIVS						as Fecha,
	CUEIVS						as CContable,
	CIFIVS						as NIF,
	NOMIVS						as Denominación,
.... etc etc..