sábado, 12 de março de 2011

Trabalhando com mais de uma Tabela Fato

Muitas vezes necessitamos associar dados entre duas ou mais Tabelas Fatos, o maior problema é que nem sempre temos 100% das informações associadas entre as Tabelas Fato ou temos dimensões diferentes entre elas.

Para resolvermos isso vamos criar uma tabela de ligação (Link Table).

Neste post falarei sobre a solução através de Link Table.

Temos as seguintes tabelas para criar o nosso modelo de dados associativo no QlikView.
Vendas, Orçamento, Cliente, Filial, Vendedor e Tipo Venda.


Como vamos utilizar a solução de Link Table, primeiramente temos que criar um campo chave utilizando a função AutoNumber() concatenando os campos comuns entre as tabelas fato e iremos comentar os campos envolvidos na chave.

Venda:
LOAD
AutoNumber(Data&'|'&[Código Vendedor]) as %ChaveLinkTable,
//Data,
[Código Venda],
[Código Cliente],
//[Código Vendedor],
[Código Tipo Venda],
[Código Filial],
[Valor Venda]
FROM
QVD\Venda.QVD
(qvd);

Orçamento:
LOAD
AutoNumber(MakeDate(Right([Mês Ano],4),Left([Mês Ano],2),1)&'|'& [Código Vendedor]) as %ChaveLinkTable,
//[Código Vendedor],
[Valor Orçado]
FROM
QVD\Orçamento.QVD
(qvd);

Agora que já criamos a chave e eliminamos os campos comuns entre as tabelas fatos, vamos criar a tabela de ligação (LinkTable).

//===========================================
// LINK TABLE
//===========================================
LinkTable:
LOAD DISTINCT
AutoNumber(Data&'|'&[Código Vendedor]) as %ChaveLinkTable,
Data,
[Código Vendedor]
FROM
QVD\Venda.QVD
(qvd);

LinkTable:
LOAD DISTINCT
AutoNumber(MakeDate(Right([Mês Ano],4),Left([Mês Ano],2),1)&'|'& [Código Vendedor]) as %ChaveLinkTable,
Date(MakeDate(Right([Mês Ano],4),Left([Mês Ano],2),1),'DD/MM/YYYY') as Data,
[Código Vendedor]
FROM
QVD\Orçamento.QVD
(qvd);

Agora temos três tabelas no nosso modelo de dados associativo.
Com essa nova tabela gerada com base nas informações das duas fatos, garantimos que teremos todos possibilidade de combinações entre as Tabelas Fato.
Podemos continuar a carga das demais tabelas do modelo.

Cliente:
LOAD
[Código Cliente],
[Nome Cliente]
FROM
QVD\Cliente.QVD
(qvd);

Filial:
LOAD
[Código Filial],
[Descrição Filial]
FROM
QVD\Filial.QVD
(qvd);

Vendedor:
LOAD
[Código Vendedor],
[Nome Vendedor]
FROM
QVD\Vendedor.QVD
(qvd);

[Tipo Venda]:
LOAD
[Código Tipo Venda],
[Descrição Tipo Venda]
FROM
[QVD\Tipo Venda.QVD]
(qvd);


Agora temos a nossa dimensão Vendedor associada a nossa tabela de ligação (LinkTable).

Para concluirmos o nosso modelo de dados associativo, vamos criar a tabela de calendário.

TMP_Calendario:
LOAD DISTINCT
Data
FROM
QVD\Venda.QVD
(qvd);

TMP_Calendario:
LOAD DISTINCT
Date(MakeDate(Right([Mês Ano],4),Left([Mês Ano],2),1),'DD/MM/YYYY') as Data
FROM
QVD\Orçamento.QVD
(qvd);

Calendario:
NoConcatenate
LOAD
[Data] as Data,
Day(Data) as Dia,
Month(Data) as Mês,
Year(Data) as Ano,
DayNumberOfQuarter(Data) as [Dia Trimestre],
DayNumberOfYear(Data) as [Dia Ano],
MonthName(Data) as [Mes Ano],
QuarterName(Data) as [Quarter],
Week(Data) as [Semana],
ceil(Month(Data)/3)&'º Trim' as [Trimestre],
WeekDay(Data) as [Dia Semana]
Resident TMP_Calendario;

DROP table TMP_Calendario;

Após a criação da tabela calendário com base nas informações das tabelas de Venda e Oraçamento, temos o seguinte modelo.

11 comentários:

  1. Boa tarde Fernando.
    Muito boa a dica.
    Estou com a situação seguinte:
    Banco de Dados Oracle, já conectado no QlikView, e carregando tabelas normalmente. As consultas que consigo executar são todas bem simples, com no maximo uma condição na WHERE.
    Minha duvida é, existe como carregar uma só consulta para duas tabelas? Tipo...
    TABELA1
    cod_pac,cod_prt,data_ent
    TABELA2
    cod_prt,nome_pac
    Eu quero todos os cod_pac e nome_pac com data_ent >= 01/01/2012,ou seja - EM ORALCE (ansi) seria assim:
    SELECT cod_pac.TABELA1,nome_pac.TABELA2
    FROM TABELA1, TABELA2
    WHERE 1 = 1
    AND TABELA1.cod_prt = TABELA2.cod_prt
    AND TABELA1.data_ent >= '01/01/2012'
    ORDER BY TABELA1.cod_pac

    Como faço isso no QlikView???

    Desde já agradeço.

    ResponderExcluir
    Respostas
    1. Olá Rozan, você pode pegar esse SQL e executar diretamente no QlikView.
      Faça Assim:

      SQL SELECT TABELA1.cod_pac,TABELA2.nome_pac
      FROM TABELA1, TABELA2
      WHERE 1 = 1
      AND TABELA1.cod_prt = TABELA2.cod_prt
      AND TABELA1.data_ent >= '01/01/2012'
      ORDER BY TABELA1.cod_pac;

      Excluir
  2. Boa tarde Fernando,
    Estou iniciando meus estudos a respeito da ferramenta, nunca trabalhei com o qlikview, gostaria de saber se existe um guia pratico ou algum lugar com video aulas em portugues para melhor entendimento desta ferramenta......
    Obrigado
    Marcio Roberto de Souza

    ResponderExcluir
    Respostas
    1. Olá Marcio,

      Realmente a quantidade de informação em português é bem restrita. Você pode buscar informações no site da Comunidade QlikView da QlikTech. Essa comunidade possui pessoas do mundo inteiro, lá possui um grupo do brasil que possui documentos em português sobre o QlikView.
      Segue URL da Comunidade QlikVeiew.
      http://community.qlikview.com

      Excluir
  3. Olá Fernando,
    Muito bacana a sua dica!
    Gostaria de saber em relação a performance, pois já ouvi dizer que este tipo de relacionamento afeta muito a performance...isso é verdade? Já ouviu dizer algo do tipo?
    Obrigada!
    Aline Onishi

    ResponderExcluir
    Respostas
    1. Olá Aline, Obrigado.
      Sim realmente o tipo de modelo no QlikView tem impacto na performace. Vou escrever um post simples falando sobre isso.
      Abraços.

      Excluir
  4. Olá Fernando, utilizo a geração de qvds para dar carga em algumas visões independentes, consigo gerar mais de um qvd com condições distintas? ou seja, tenho um qvd master e queria gerar também outros qvds com condições distintas, consigo fazer isto?

    ResponderExcluir
    Respostas
    1. Olá Você pode ler o seu QVD Master aplicando as regras ou condições necessária e gravar um novo QVD. Pode fazer isso para cada uma das regras que possui, sendo que se houverem 5 regras no final você terá mais 5 arquivos QVD.

      Excluir
  5. Olá, Fernando. Percebi que as consultas ao dados do banco de dados seguem o padrão SQL. Porém, percebo que o Qlikview também utiliza códigos específicos da própria ferramenta. Minha pergunta é: onde aprendo sobre esses códigos ou linguagem? Que linguagem é esta?. Realmente, as consultas ao banco seguem o padrão SQL? Obrigado.

    ResponderExcluir
  6. Olá Fernando, tenho duas dimensões que se ligam a duas fatos a melhor solução é usar linktable?

    ResponderExcluir
  7. Olá Fernando

    Tenho uma situação aonde uma tabela possui 2 registros, e esses 2 registros preciso uni-los em somente 1 registro.
    Já tentei utilizar a função above, mas não consegui fazer funcionar.


    Obrigado

    ResponderExcluir