Fórum Consulta sql com remoção de duplicidade por contato/cliente #319749

22/04/2006

0

Salve !!!

Tenho banco Firebird 1.5 e to precisando fazer um filtro nas seguintes tabelas:

CLIENTE
IDCLIENTE
FANTASIA

TELEFONE
IDTELEFONE
IDCLIENTE
NOME

Tenho o seguinte sql:
select TEL.NOME, TEL.IDTELEFONE, TEL.IDCLIENTE, CLI.FANTASIA from TELEFONE TEL left join CLIENTE CLI on (TEL.IDCLIENTE = CLI.IDCLIENTE) group by 1,2,3,4 order by CLI.FANTASIA, TEL.NOME


E estou tendo este retorno:

NOME IDTELEFONE IDCLIENTE FANTASIA MARCELO MOREIRA 8 2 CARTAZ INFORMATICA MARCIO PACELLI 9 2 CARTAZ INFORMATICA MARCELO MOREIRA 4 1 EASY SISTEMAS LTDA MARCELO MOREIRA 6 1 EASY SISTEMAS LTDA PAULO NONATO 7 1 EASY SISTEMAS MARCELO MOREIRA 10 3 MAXTRACK


O que eu preciso neste caso ai é que nao apareca na quarta linha nomvamente o nome MARCELO MOREIRA. O que acontece é que para o cliente EASY SISTEMAS o contato MARCELO MOREIRA foi cadastrado duas vezes mas com numeros de telefone diferente. Entao a duplicidade no cadastro esta certo mesmo ... eu so quero elimina-lo da consulta.

Se alguem puder me ajudar ...
valewss


Mmoreira

Mmoreira

Responder

Posts

22/04/2006

Motta

select TEL.NOME, TEL.IDTELEFONE, TEL.IDCLIENTE, CLI.FANTASIA 
from TELEFONE TEL 
left join CLIENTE CLI on (TEL.IDCLIENTE = CLI.IDCLIENTE) 
and tel.idtelefone = (select max(idtelefone)
                              from telefone tel2
                              where tel2.idcliente = tel.idcliente) 
group by 1,2,3,4 
order by CLI.FANTASIA, TEL.NOME 



tenta isto ...
vai trazer o tel de maior codigo


Responder

Gostei + 0

24/04/2006

Mmoreira

Mota,

O sql que vc me passou não retornou as informações como eu preciso. A duplicidade dos contatos ainda esta ocorrendo.


Responder

Gostei + 0

24/04/2006

Motta

Pelo que entendi deveria funcionar, pegaria o idfone de maior valor para um cliente.


Responder

Gostei + 0

24/04/2006

Emerson Nascimento

tente assim:
select
  TEL.NOME, min(TEL.IDTELEFONE) IDTELEFONE,
  TEL.IDCLIENTE, CLI.FANTASIA
from
  TELEFONE TEL 
left join
  CLIENTE CLI on (TEL.IDCLIENTE = CLI.IDCLIENTE)
group by
  TEL.NOME, TEL.IDCLIENTE, CLI.FANTASIA 
order by
  CLI.FANTASIA, TEL.NOME
note que eu optei por exibir o menor id do telefone ( min(TEL.IDTELEFONE) ).
você pode querer exibir o maior id do telefone. se sua opção for essa, altere para MAX(TEL.IDTELEFONE)


Responder

Gostei + 0

24/04/2006

Mmoreira

emerson.en

Cara funcionou blzinha. Resolveu meu problema.
Fico muito agradecido.

valewsss


Responder

Gostei + 0

27/04/2006

Mmoreira

Emerson.en

Só completando, estou precisando colocar mais uma coluna na minha consulta, a coluna: TEL.TELEFONE então fiz assim:

select 
  TEL.NOME, 
  min(TEL.IDTELEFONE) IDTELEFONE, 
  TEL.IDCLIENTE, 
  TEL.EMAIL, 
  TEL.TELEFONE, /* Adicionei aqui */
  CLI.FANTAZIA 

from TELEFONE TEL

left join CLIENTE CLI on (TEL.IDCLIENTE = CLI.IDCLIENTE) 

group by 
  TEL.NOME, 
  TEL.IDCLIENTE, 
  TEL.EMAIL, 
  TEL.TELEFONE, /* Adicionei aqui */
  CLI.FANTAZIA
  
order by 
  TEL.NOME, 
  CLI.FANTAZIA


Depois q fiz isso as duplicidades estam ocorrendo novamente ...

pode me dar uma luz??
valew


Responder

Gostei + 0

27/04/2006

Emerson Nascimento

tente diferente:
select
  TEL.NOME,
  TEL.IDTELEFONE,
  TEL.IDCLIENTE,
  TEL.EMAIL,
  TEL.TELEFONE,
  CLI.FANTAZIA
from
  TELEFONE TEL
left join
  CLIENTE CLI on (CLI.IDCLIENTE = TEL.IDCLIENTE)
where
  TEL.IDTELEFONE in
    (select
       Min(TEL2.IDTELEFONE)
     from
       TELEFONE TEL2
     group by
       TEL2.NOME,
       TEL2.EMAIL,
       TEL2.TELEFONE)
order by
  TEL.NOME,
  CLI.FANTAZIA
se ainda assim aparecerem registros repetidos, talvez seja por conta de o campo TELEFONE ter informações diferentes. se você quiser somente o telefone do primeiro registro encontrado, retire TEL2.TELEFONE do group by.
acho que é isso...

P.S: para sua consulta ficar mais veloz, crie os índices necessários (se ainda não o fez)


Responder

Gostei + 0

27/04/2006

Mmoreira

Dito e feito,
tirei o

TEL2.TELEFONE

do group by e funcionou blzinha!!!

valew cara


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar