Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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?
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.
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.
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 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.
Deu certo.
Muito obrigado!!