Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde.
Andei pesquisando como faço para listar registros duplicados, e consegui fazer uma grande parte, quando um ou dois registros são iguais.
Mas agora preciso listar quando todos os registros forem idênticos.
Vou montar um exemplo pra especificar melhor o que preciso:
Cliente
--------------------------------------------------
IdCliente | NmCliente | TelefoneCliente
---------------------------------------------------
123 | Joao Josue | 32846547
456 | Joao Jose | 82803140
456 | Joao Jose | 82803140
-----------------------------------------------------
Eu preciso listar esses dois registros que são tem todos os campos idênticos.
Seguindo o exemplo, tenho esse código:
SELECT IdCliente, NmCliente FROM Cliente GROUP BY IdCliente, NmCliente, TelefoneCliente HAVING COUNT(IdCliente) > 1 and COUNT(NmCliente) > 1 and COUT (TelefoneCliente) > 1
Mas ele não está me retornando os dois registros. Alguém tem alguma dica?
Obrigada
Bem lembrado A.Jr
Bem lembrado A.Jr
eu só tinha rápido pois estava escrevendo um artigo justamente sobre o assunto :p
Bom pessoal, pra situação que descrevi a solução atende completamente.
Mas como não estou conseguindo resolver, vou tentar explicar a dificuldade dessa seleção:
Tenho duas tabelas:
Pedido e Item Pedido.
O primeiro ponto é listar os pedidos em que o cpf do cliente apareça mais de uma vez. Ou seja, listar pedidos que tenham sido feitos pela mesma pessoa duas ou mais vezes. Consegui com o seguinte código:
QueryIPedido
SELECT IdPedido FROM Pedido as p where p.NrCpfCnpjCliente IN (
SELECT NrCpfCnpjCliente FROM Pedido GROUP BY NrCpfCnpjCliente HAVING COUNT(NrCpfCnpjCliente ) >= 2Depois, consegui listar os itens que correspondem a esses pedidos:
QueryItem
SELECT * FROM ItemPedido where FkPedido IN (
SELECT IdPedido FROM Pedido as p where p.NrCpfCnpjCliente IN (
SELECT NrCpfCnpjCliente FROM Pedido GROUP BY NrCpfCnpjCliente HAVING COUNT(NrCpfCnpjCliente ) >= 2
AND p.FlStatusPedido = 'P'
)
)
O que preciso agora é listar os itens dos pedidos selecionados que são iguais.
Por exemplo:
------------
Pedidos
------------
20130001
20130002
---------------------
Itens pedido
---------------------
IdItem | FkPedido | NrAtividade
1 | 20130001| 123
2 | 20130002| 123
3 | 20130002| 1234
Preciso listar os Itens em que o campo NrAtividade, por exemplo, são iguais. No caso, o item 1 e 2, pois tem pedidos que correspondem a primeira condição.
Já estou esgotando tudo que pensei. Já tentei com having, com tabela temporária fazendo join, e comparações, mas ainda não consegui.
São clientes com mais de um pedido..
Mas o que está sendo complicado é listar os itens iguais desses pedidos..
Coloquei o titulo como duplicado porque pensei que seria possível localizar esses itens através desse tratamento.
Tente algo assim.
Produto pedios mais de uma vez por cliente
select NrCpfCnpjCliente, cod_produto
from pedido,item_pedido
where pedido.idpedido = item_pedido.idpedido
group by NrCpfCnpjCliente, cod_produto
having count(*) > 1
Mas eu já consegui essa parte
SELECT IdPedido FROM Pedido as p where p.NrCpfCnpjCliente IN ( SELECT NrCpfCnpjCliente FROM Pedido GROUP BY NrCpfCnpjCliente HAVING COUNT(NrCpfCnpjCliente ) >= 2 AND p.FlStatusPedido = 'P' )
Mas isto não é um erro ?! Não ?
Um cliente pode fazer um Item mais de uma vez !?
Não seria uma linha repetida
Não..
O fluxo é assim: Cliente cadastra um pedido, e nele vários itens.
Depois de um tempo, esse pedido não atendido passa a fica com status pendente.
Logo depois, ele cadastra um novo pedido, com status ativo, e cadastra outros itens.
Possivelmente, esse ultimo pedido pode ter itens já pedidos no pedido anterior(o que está pendente). Se isso acontecer, eu listo os pedidos cujos itens tem um ou mais itens repetidos nos dois pedidos.
Não é um erro, é uma possibilidade do sistema.
Já pensou em usar uma function ?
Recebe por parametro CLEINTE, PEDIDO e PRODUTO e
busca se acha este produto em outro PEDIDO do CLIENTE
diferente do PEDIDO passado por parametro.
Caso ache retorna 1 , senão retorna 0.
A query busca com esta function.
Achei legal a ideia do Motta
Montei uma função com base no que eu entendi da sua regra de negócio
Você passa o pedido e o nr da Atividade...
O que a função faz retorna todos pedidos abertos (diferentes do pedido atual) nos quais a atividade selecionada aparece
create function pedidorepedido (
@idpedido varchar(1000)
,@nratividade varchar(1000)
) returns @tb table (IdItem
,FkPedido
,NrAtividade)
as
begin
declare @nrcpfcnpjcliente varchar(1000)
select @nrcpfcnpjcliente = nrcpfcnpjcliente from pedido where idpedido = @idpedido
insert into @tb
(iditem ,fkpedido ,nratividade)
select
iditem ,fkpedido ,nratividade
from
item_pedido
where
nratividade = @nratividade
exists (select ''
from pedido
where
pedido.idpedido = item_pedido.idpedido
and pedido.idpedido <> @idpedido
and pedido.nrcpfcnpjcliente = @nrcpfcnpjcliente
and pedido.flstatuspedido = 'p'
)
returns
end
Espero que ajude
Show
duplicados
select IdCliente , NmCliente , TelefoneCliente
from Cliente
group by dCliente , NmCliente , TelefoneCliente
having count(*) > 1
quem são os duplicados
select IdCliente , NmCliente , TelefoneCliente
from Cliente