Skip to main content
Announcements
Global Transformation Awards! Applications are now open. Submit Entry
cancel
Showing results for 
Search instead for 
Did you mean: 
mxell
Contributor III
Contributor III

Como verificar se valor existe em outra tabela e aplicar?

Tenho 2 tabelas, preciso verificar na coluna lista na tabela 2, se existe o mesmo valor de item e lista para a tabela 1

Exemplo

Tenho as seguintes tabelas:

 

Tabela 1
Item Lista 1 Lista 2
A 10 15
B 20 25
C 30 35
D 40 45
E 50 55

 

 

Tabela 2
Item Lista Valor
A 10 1
B 20 2
B 30 2.5
C 33 3
C 35 3.5
D 33 4
E 55 5

 

 

Fato
Item Lista Encontrada Valor
A 10 1
B 20 2
C 35 3.5
D - 0
E 55 5

 

 

Como faço?

 

 

mxell_0-1698274314823.png

 

Labels (1)
1 Solution

Accepted Solutions
rodrigo_martins
Partner - Creator
Partner - Creator

Alguns pontos da solução podem mudar dependendo da maneira como a leitura desses dados é feita. Mas a ideia geral é criar uma coluna na Tabela 2 onde você fará um mapping com a chave Item + Lista a partir da Tabela 1. Como a Tabela 1 tem duas colunas de listas, você pode fazer a leitura dela duas vezes (concatenando a leitura do Item e Lista1 com Item e Lista 2) ou pode usar o comando Crosstable, que é o mais indicado pois só será necessário ler o QVD uma única vez.

O resultado desse ApplyMap irá dizer se a chave Item + Lista da Tabela 2 existe na Tabela 1. O próximo passo é fazer uma leitura residente da Tabela 2 desconsiderando as linhas onde o ApplyMap não encontrou resultado. A tabela 2 pode ser removida do modelo (a tabela criada para o ApplyMap é removida automaticamente ao término da execução do script).

Na visualização desses dados, nesse exemplo, a fato não terá valores associados ao Item "D". Para que ele apareça seria necessária a existência de uma dimensão "Item" associada a essa fato, além da opção "Incluir valores nulos" marcada nessa coluna da tabela.

Anexei um script que simula esse cenário e implementa a solução que descrevi. 

View solution in original post

4 Replies
rodrigo_martins
Partner - Creator
Partner - Creator

Alguns pontos da solução podem mudar dependendo da maneira como a leitura desses dados é feita. Mas a ideia geral é criar uma coluna na Tabela 2 onde você fará um mapping com a chave Item + Lista a partir da Tabela 1. Como a Tabela 1 tem duas colunas de listas, você pode fazer a leitura dela duas vezes (concatenando a leitura do Item e Lista1 com Item e Lista 2) ou pode usar o comando Crosstable, que é o mais indicado pois só será necessário ler o QVD uma única vez.

O resultado desse ApplyMap irá dizer se a chave Item + Lista da Tabela 2 existe na Tabela 1. O próximo passo é fazer uma leitura residente da Tabela 2 desconsiderando as linhas onde o ApplyMap não encontrou resultado. A tabela 2 pode ser removida do modelo (a tabela criada para o ApplyMap é removida automaticamente ao término da execução do script).

Na visualização desses dados, nesse exemplo, a fato não terá valores associados ao Item "D". Para que ele apareça seria necessária a existência de uma dimensão "Item" associada a essa fato, além da opção "Incluir valores nulos" marcada nessa coluna da tabela.

Anexei um script que simula esse cenário e implementa a solução que descrevi. 

mxell
Contributor III
Contributor III
Author

rodrigo_martins, 

Obrigado pela resposta.

Fiz o teste aqui, mas quando aplico numa tabela está retornando a soma total para cada item e não o valor daquele item para ele

mxell_0-1698315906976.png

 

rodrigo_martins
Partner - Creator
Partner - Creator

@mxell enquanto estava montando o script que enviei passei por uma situação parecida. Resolvi excluindo a Tabela 2 antes de criar a fato.

tmpFato:
load
	Item,
	Lista,	
	Num(Valor) * Num(ApplyMap('mapTabela1', Item & '|' & Lista, 0)) + 0 as _valor
resident tabela2;

drop table tabela1;
drop table tabela2;

fato:
load
	Item,
	Lista,
	_valor as Valor
Resident tmpFato 
where _valor > 0;

Precisei fazer isso porque a fato e a Tabela2 tinham exatamente a mesma estrutura, e quando isso acontece o Qlik automaticamente concatena o conteúdo dos loads seguintes na primeira tabela (não criando a seguinte separadamente na memória). Quando observei os valores na tabela na tela, as linhas com _valor = 0 não haviam sido removidas.

Caso isso ainda não resolva seu problema, passe mais informações (como os dados de origem e o script ou o .qvf que você está usando) pra que eu ou outra pessoa aqui da comunidade possa te ajudar.

mxell
Contributor III
Contributor III
Author

Deu certo.

Muito obrigado!!