Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Posting on Qlik Community is temporarily paused. Thank you for patience and we'll update you soon!
cancel
Showing results for 
Search instead for 
Did you mean: 
nicolett_yuri
Partner Ambassador/MVP
Partner Ambassador/MVP

Expressões considerando datas diferentes

É um caso aparentemente simples (que sempre é solicitado rsrs) em que um gráfico com dimensão temporal (dia ou mês ou ano) referencia duas expressões que se baseiam em datas diferentes, por exemplo: Quantidade de notas emitidas e quantidade de notas canceladas em que a quantidade de notas emitidas se baseia na coluna temporal DATA_EMISSAO e a quantidade de notas canceladas se baseia na coluna temporal DATA_CANCELAMENTO.

Pergunta: Qual a coluna de data que se deve utilizar na dimensão do gráfico? Se usarmos a data de emissão, a coluna de notas canceladas ficará incorreta, pois nem todas as notas canceladas foram canceladas na data (ou mês ou ano) da emissão.  Se usarmos a data de cancelamento, a coluna de notas emitidas ficará incorreta devido ao mesmo caso.

Com o problema em mãos, começamos a pensar sobre possíveis soluções, por exemplo:

  1. Criar uma tabela de calendário isolada da modelagem (sem nenhuma ligação) “a famosa ILHA” e fazer a referência dentro da expressão. Problema: A performance de sua aplicação vai despencar.
  2. Isolar os fatos em tabelas separadas: tabela de notas emitidas e tabela de notas canceladas. Problema: A performance é boa, porém iremos duplicar o volume de dados de nossa aplicação.

Confesso que estava partindo para a solução 2, porém me veio um “insight” na cabeça: Porque não criar uma linktable das datas? Isso me aumentaria um “IF” dentro do gráfico, porém continuaria com uma boa performance e não aumentaria, em muito, minha volumetria de dados.

Vamos a prática:

1) Criamos a nossa tabela Fato:

Fato:
LOAD * INLINE [
NUM_NOTA, VALOR, DATA_EMISSAO, DATA_CANCELAMENTO
00001, 10, 01/01/2014, 10/02/2014
00002, 2, 05/01/2014,
00003, 1, 05/01/2014
00004, 5, 05/01/2014, 10/01/2014
00005, 11, 06/01/2014, 10/01/2014
00006, 8, 06/01/2014,
00007, 12, 06/01/2014,
00008, 4, 01/02/2014, 05/02/2014
00009, 8, 01/02/2014, 10/02/2014
00010, 4, 01/02/2014, 18/02/2014
00011, 3, 05/02/2014,
00012, 5, 05/02/2014,
00013, 10, 10/02/2014, 01/03/2014
00014, 2, 01/03/2014, 10/03/2014
];

2) Criamos uma tabela de Link entre o fato e o nosso calendário oficial, para criar esse link devemos dividir a tabela fato em duas: a primeira com as datas de emissão e a segunda com as datas de cancelamento. Após a divisão devemos concatena-las utilizando o mesmo nome do campo de data, mas lembre-se de criar uma coluna com o identificador da origem da data.

IMPORTANTE: Alem do campo de data e identificador, também devemos decidir qual será o campo chave entre a tabela de Link e a tabela Fato.

LinkData:
LOAD
NUM_NOTA,
DATA_EMISSAO as Data,
'DataEmissao' as Tipo
RESIDENT Fato;

LOAD
NUM_NOTA,
DATA_CANCELAMENTO as Data,
'DataCancelamento' as Tipo
RESIDENT Fato
WHERE
LEN(TRIM(DATA_CANCELAMENTO))>0; //Garantia para concatenar somente datas de cancelamento válidas.

3) Criar a tabela de calendário e fazer a ligação entre a tabela calendário com a tabela de Link.

Realizado os passos, no gráfico, utilize a dimensão de Mês e Ano da tabela de calendário e nas expressões faça a referência com a coluna de identificação da origem da data, conforme exemplo abaixo:

Expressão para quantidade de notas fiscais emitidas

COUNT( {$<Tipo={"DataEmissao"}>} NUM_NOTA)

Expressão para quantidade de notas fiscais canceladas

COUNT( {$<Tipo={"DataCancelamento"}>} NUM_NOTA)

Pronto, agora podemos referenciar as datas no mesmo gráfico, garantir uma alta performance e não aumentar muito a volumetria de dados em nossa aplicação.

PS: Isso vale para datas em tabelas diferentes, o processo será o mesmo.

Estou anexando uma aplicação de exemplo para vocês.

Labels (1)
1 Reply
Anonymous
Not applicable

Bom dia Yuri

Estou tentando montar um grafico desse tipo em QLIK Sense, porém, no meu APP só possui consulta a 1 view de SQL que já contém 2 datas distintas <data de inicio> e <data de encerramento>, faço apenas contagem simples sendo mostrados em grafico de barras e a conexão é OLE DB. Mas não estou conseguindo.

Estou montando com uma dimensão hierárquica, mas já teste com a data diretamente e também não vai!

Consegue me dar uma luz?