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.