Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
mercadante
Creator
Creator

Relacionamento de N para N

Sr(as). Boa tarde!

Alguém sabe como posso resolver a seguinte situação.

Tenho duas tabelas que possuem o numero do contrato, data da venda em comum.

Porem, o relacionamento delas é de N pra N.

Tenho para um mesmo contrato em uma mesma data de venda vário registros. Esta Situação é comum entre as duas tabelas.

Tabela A

Numero contratoData Venda
000123/10/2014
000123/10/2014
000222/10/2014
000222/10/2014
000222/10/2014

Tabela B

Numero ContratoData VendaData Pagamento
000123/10/201427/10/2014
000123/10/201427/10/2014
000222/10/201424/10/2014
000222/10/201424/10/2014
000222/10/201424/10/2014
000222/10/201424/10/2014

Conforme exemplo acima, o cliente 0002 fez três compras, mas consta 4 pagamentos, pois pagou uma fatura em duplicidade.

Não estou conseguindo relacionar estas tabelas.

Alguém pode mostrar o caminho das pedras ?

Obrigado!

1 Solution

Accepted Solutions
lucianosv
Specialist
Specialist

Só lembrando que a primeira tabela não têm data de pagamento.

Eu ainda sugiro que você crie um count([Numero Contrato] & '|' & [Data Venda]) para compras e um count([Numero Contrato] & '|' & [Data Venda]) para pagamentos já no script para poder controlar esses erros ou exceções.

View solution in original post

14 Replies
lucianosv
Specialist
Specialist

É simples.

Você vai criar uma chave composta por Numero Contrato e Data Venda, nas duas tabelas e manter o valor dos campos em uma só delas.

Outra solução seria concatenar as duas tabelas.

[Numero Contrato] & '|' & [Data Venda] as Key_Venda

thiago_mlg
Creator II
Creator II

Antonio, boa tarde.

Apenas para detalhar melhor o que o Luciano colocou, a composição da carga seria assim:

Imagine que sua tabela seja:

A primeira que contem somente Numero contrato e venda.. seria por exemplo a Tabela de vendas e a segunda seria tabela pagamento, entao seria.

Vendas:

Load

[Numero Contrato] & '|' & [Data Venda] as Key_Venda

[Numero Contrato]                               as NumeroContrato1

[Data Venda]                                       as DataVenda1

o resto dos campos

from *****


Pagamentos:

Load

[Numero Contrato] & '|' & [Data Venda] as Key_Venda

[Numero Contrato]                               as NumeroContrato2

[Data Venda]                                       as DataVenda2

o resto dos campos

From ****


Desta forma o relacionamento entre as tabelas se dará apenas pela KEY_VENDA.


Espero ter ajudado.



mercadante
Creator
Creator
Author

Bom dia Thiago!

Então, o problema é que estas  tabelas estão sendo carregadas em um painel que já esta em produção.

Para minha necessidade o ideal seria a união das duas tabelas em um unica, porem a  dificuldade esta justamente em unir elas. Como é N para N ela esta multiplicando os valores

No exemplo da tabela que eu postei, tenho o contrato 0002 que na tabela A possui três registros com mesma data.

Na tabela B "pagamento" possui quatro registros, pois o cliente pagou uma fatura em duplicidade.

Quando faço um join das tabelas ele mostra muito mais registros do que tenho.

O inverso também pode acontecer, exemplo:

O mesmo Cliente efetua mais de uma compra no mesmo dia, porem efetua o pagamento somente de uma compra.

Não tenho nenhum campo que faça a distinção das linhas. Tabela A ,é Contrato, Data Venda, Nome do Produto e Valor da Venda. e para a Tabela B é Contrato, Data Venda e Data Pagamento.

Esse problema esta mais para modelagem do que o próprio qlikview. Pelo menos é o que acho.

rogerioqv
Creator II
Creator II

Antonio,

Pelo que vi uma tabela é a realização da venda e a outra o pagamento desta venda.

Se você concatenar as duas tabelas, criando uma flag para identificar o tipo do registro (V = Venda e P = Pagamento), assim, não haveria duplicidade de linhas e você pela flag faria os filtros necessários.

Ex:

TABELAO:

LOAD

  CONTRATO,

  DATAVENDA,

  '' DATAPAGAMENTO,

  'V' AS TIPOREGISTRO

FROM TABELA1;

CONCATENATE

LOAD

  CONTRATO,

  DATAVENDA,

  DATAPAGAMENTO,

  'P' AS TIPOREGISTRO

FROM TABELA2;

Será que ajuda?

Abraços.

thiago_mlg
Creator II
Creator II

Antonio, bom dia!

Utilize o que o Rogério sugeriu, é a forma mais tranquila para transformar 2 tabelas em uma fato.

Qualquer dificuldade, poste aqui e tentaremos lhe auxiliar.

lucianosv
Specialist
Specialist

Só lembrando que a primeira tabela não têm data de pagamento.

Eu ainda sugiro que você crie um count([Numero Contrato] & '|' & [Data Venda]) para compras e um count([Numero Contrato] & '|' & [Data Venda]) para pagamentos já no script para poder controlar esses erros ou exceções.

mercadante
Creator
Creator
Author

Bom dia Rogério!

Estou convencido de que não é possível fazer o que preciso pelo simples fato

Tabela A

Numero contratoData Venda
000222/10/2014
000222/10/2014
000222/10/2014

Tabela B

Numero ContratoData VendaData Pagamento
000222/10/201424/10/2014

Se eu concatenar a tabela B com a A, vou popular as três linhas da tabela A com a data de pagamento 24/10/2014. O que não condiz com a realidade, pois efetuei somente um pagamento.

Por incrível que pareça, o usuário esta controlando isso via Excel. Tentei fazer um milagre aqui mas não foi possível.

Vocês que possuem mais experiência, concordam com a minha conclusão ou eu ainda não consegui entender a solução?

mercadante
Creator
Creator
Author

Luciano,

Eu tentei fazer o que você esta sugerindo, mas ao invés de Count utilizei o AutoNumber.

Mas mesmo assim, não consigo entender essa solução.

Veja o que postei em resposta a orientação do Rogério.

Estou me convencendo de que não é possível.

lucianosv
Specialist
Specialist

Você vai fazer o seguinte:

Ex:

TABELAO:

LOAD

  CONTRATO,

  DATAVENDA,

  'V' AS TIPOREGISTRO,

  count(CONTRATO & DATAVENDA) as qtdecompras

FROM TABELA1

Group by CONTRATO,

  DATAVENDA,

  TIPOREGISTRO;

CONCATENATE

LOAD

  CONTRATO,

  DATAVENDA,

  DATAPAGAMENTO,

  'P' AS TIPOREGISTRO,

count(CONTRATO & DATAPAGAMENTO) as qtdepagamentos

FROM TABELA2

Group by CONTRATO,

  DATAVENDA,

  DATAPAGAMENTO,

  TIPOREGISTRO;