Usuário com melhor resposta
Select por status do Pedido

Pergunta
-
Ola Pessoal !!
Duvida é o seguinte..Tenho Duas tabelas(Clientes e Pedidos)
Clientes(ClienteID,Nome,Enderece)
Pedidos(CodPedido,Data,StatusPedido,ClienteID)
O StatusPedido define a situação do pedido tipo :
1= PedidoPago
2= Pedido em Aberto
3= Pedido em Protesto
4= Pedido em Avaliação
Eu Preciso de um select que me traga todos os clientes que estão com pedidos do status 1 e que nao tenha mais nenhum pedido com outros status por exemplo ,lembrando que o cliente pode ter mais de um pedido em aberto e com status situações diferentes
Estou começando a Desenvolver e estou tendo esta dificuldade se alguem puder me ajudar eu agradeço!
Obrigado
Respostas
-
Tentei assim De uma olhada pra ver se ficou meio tosco ou não ,ok
Segue para testar:
SELECT Clientes.ClienteID, Clientes.nome, Clientes.Endereco, Clientes.Bairro, Clientes.Frente, Clientes.Lado, Clientes.Mapa, Clientes.Referencia,
Clientes.Cep, Clientes.EstadoID, Clientes.Cidade, Clientes.Tel_res, Clientes.numero, Clientes.Tel_Cel, Clientes.StatusTelID, Clientes.Rg, Clientes.Cpf,
Clientes.RegiaoID, Clientes.Texto, Clientes.DataCad, Clientes.Cred, OrdemPedidos.Resolvido
FROM Clientes INNER JOIN
OrdemPedidos ON Clientes.ClienteID = OrdemPedidos.ClienteID
WHERE (Clientes.ClienteID NOT IN
(SELECT ClienteID
FROM OrdemPedidos AS OrdemPedidos_1
WHERE (StatusOrdemID = 1) OR
(StatusOrdemID = 2) OR
(StatusOrdemID = 3) OR
(StatusOrdemID = 4) OR
(StatusOrdemID = 6) OR
(StatusOrdemID = 7) OR
(StatusOrdemID = 8)))
O que me interessa é pegar todos os clientes com status 5 de pagos e que nao tenha nenhum outro pedido com outro status
Nesse caso to pegando todos clientes que nao tenha pedidos com status(1,2,3,4,6,7,8) me baseando na idéa do Leandro
Se alguém tiver uma solução melhor por favor!!
SELECT Clientes.ClienteID, Clientes.nome, Clientes.Endereco, Clientes.Bairro, Clientes.Frente, Clientes.Lado, Clientes.Mapa, Clientes.Referencia,
Clientes.Cep, Clientes.EstadoID, Clientes.Cidade, Clientes.Tel_res, Clientes.numero, Clientes.Tel_Cel, Clientes.StatusTelID, Clientes.Rg, Clientes.Cpf,
Clientes.RegiaoID, Clientes.Texto, Clientes.DataCad, Clientes.Cred, OrdemPedidos.Resolvido
FROM Clientes INNER JOIN
OrdemPedidos ON Clientes.ClienteID = OrdemPedidos.ClienteID
WHERE Clientes.ClienteID NOT IN (SELECT ClienteID FROM OrdemPedidos AS OrdemPedidos_1 WHERE StatusOrdemID <> 5)
Att. Leandro Hexsel Bugalho- Marcado como Resposta Leonardo Leite terça-feira, 22 de setembro de 2009 18:42
Todas as Respostas
-
Bom Dia,
Esse é um problema de álgebra relacional bem interessante. Eu sugiro a seguinte implementação:-- Retorna somente os clientes que tem pedidos no Status igual a 1 SELECT ClienteID, COUNT(*) FROM Pedidos WHERE StatusPedido != 1 GROUP BY ClienteID HAVING COUNT(*) = 0 -- Combina a consulta anterior com os dados da tabela de Clientes SELECT C.ClienteID, Nome, Endereco FROM Clientes As C INNER JOIN Pedidos As P ON C.ClienteID = P.ClienteID WHERE P.StatusPedido != 1 GROUP BY C.ClienteID, Nome, Endereco HAVING COUNT(*) = 0
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
A armadilha do Backup Diferencial – O que fazer para evitá-la ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!719.entry
Classifique as respostas. O seu feedback é imprescindível
-
-
Olá Leandro,
Inicialmente eu pensei assim também, mas se um mesmo cliente pode ter pedidos com status 1 e 2.
Se utilizarmos o NOT com o <>, podemos trazer um cliente que tenha pedidos com status 1 e 2.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
A armadilha do Backup Diferencial – O que fazer para evitá-la ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!719.entry
Classifique as respostas. O seu feedback é imprescindível -
Tentei assim De uma olhada pra ver se ficou meio tosco ou não ,ok
SELECT Clientes.ClienteID, Clientes.nome, Clientes.Endereco, Clientes.Bairro, Clientes.Frente, Clientes.Lado, Clientes.Mapa, Clientes.Referencia,
Clientes.Cep, Clientes.EstadoID, Clientes.Cidade, Clientes.Tel_res, Clientes.numero, Clientes.Tel_Cel, Clientes.StatusTelID, Clientes.Rg, Clientes.Cpf,
Clientes.RegiaoID, Clientes.Texto, Clientes.DataCad, Clientes.Cred, OrdemPedidos.Resolvido
FROM Clientes INNER JOIN
OrdemPedidos ON Clientes.ClienteID = OrdemPedidos.ClienteID
WHERE (Clientes.ClienteID NOT IN
(SELECT ClienteID
FROM OrdemPedidos AS OrdemPedidos_1
WHERE (StatusOrdemID = 1) OR
(StatusOrdemID = 2) OR
(StatusOrdemID = 3) OR
(StatusOrdemID = 4) OR
(StatusOrdemID = 6) OR
(StatusOrdemID = 7) OR
(StatusOrdemID = 8)))
O que me interessa é pegar todos os clientes com status 5 de pagos e que nao tenha nenhum outro pedido com outro status
Nesse caso to pegando todos clientes que nao tenha pedidos com status(1,2,3,4,6,7,8) me baseando na idéa do Leandro
Se alguém tiver uma solução melhor por favor!! -
Gustavo, não vai trazer pois o sub select vai trazer todos os clientes que tenham statusPedido <> 1 . Se ele tiver um status 1 e um 3 por exemplo ele vai cair no subselect e o not não vai inclui-lo no resultado final .
Att. Leandro Hexsel Bugalho -
Tentei assim De uma olhada pra ver se ficou meio tosco ou não ,ok
Segue para testar:
SELECT Clientes.ClienteID, Clientes.nome, Clientes.Endereco, Clientes.Bairro, Clientes.Frente, Clientes.Lado, Clientes.Mapa, Clientes.Referencia,
Clientes.Cep, Clientes.EstadoID, Clientes.Cidade, Clientes.Tel_res, Clientes.numero, Clientes.Tel_Cel, Clientes.StatusTelID, Clientes.Rg, Clientes.Cpf,
Clientes.RegiaoID, Clientes.Texto, Clientes.DataCad, Clientes.Cred, OrdemPedidos.Resolvido
FROM Clientes INNER JOIN
OrdemPedidos ON Clientes.ClienteID = OrdemPedidos.ClienteID
WHERE (Clientes.ClienteID NOT IN
(SELECT ClienteID
FROM OrdemPedidos AS OrdemPedidos_1
WHERE (StatusOrdemID = 1) OR
(StatusOrdemID = 2) OR
(StatusOrdemID = 3) OR
(StatusOrdemID = 4) OR
(StatusOrdemID = 6) OR
(StatusOrdemID = 7) OR
(StatusOrdemID = 8)))
O que me interessa é pegar todos os clientes com status 5 de pagos e que nao tenha nenhum outro pedido com outro status
Nesse caso to pegando todos clientes que nao tenha pedidos com status(1,2,3,4,6,7,8) me baseando na idéa do Leandro
Se alguém tiver uma solução melhor por favor!!
SELECT Clientes.ClienteID, Clientes.nome, Clientes.Endereco, Clientes.Bairro, Clientes.Frente, Clientes.Lado, Clientes.Mapa, Clientes.Referencia,
Clientes.Cep, Clientes.EstadoID, Clientes.Cidade, Clientes.Tel_res, Clientes.numero, Clientes.Tel_Cel, Clientes.StatusTelID, Clientes.Rg, Clientes.Cpf,
Clientes.RegiaoID, Clientes.Texto, Clientes.DataCad, Clientes.Cred, OrdemPedidos.Resolvido
FROM Clientes INNER JOIN
OrdemPedidos ON Clientes.ClienteID = OrdemPedidos.ClienteID
WHERE Clientes.ClienteID NOT IN (SELECT ClienteID FROM OrdemPedidos AS OrdemPedidos_1 WHERE StatusOrdemID <> 5)
Att. Leandro Hexsel Bugalho- Marcado como Resposta Leonardo Leite terça-feira, 22 de setembro de 2009 18:42
-
Dev_Leo,
Desta forma creio que o seu select ficará mais rápido.SELECT Clientes.ClienteID, Clientes.nome, Clientes.Endereco, Clientes.Bairro, Clientes.Frente, Clientes.Lado, Clientes.Mapa, Clientes.Referencia, Clientes.Cep, Clientes.EstadoID, Clientes.Cidade, Clientes.Tel_res, Clientes.numero, Clientes.Tel_Cel, Clientes.StatusTelID, Clientes.Rg, Clientes.Cpf, Clientes.RegiaoID, Clientes.Texto, Clientes.DataCad, Clientes.Cred, OrdemPedidos.Resolvido FROM Clientes cl INNER JOIN OrdemPedidos ON Clientes.ClienteID = OrdemPedidos.ClienteID WHERE (SELECT count(cl1.ClienteID) FROM OrdemPedidos AS OrdemPedidos_1 WHERE cl1.ClienteID = cl.ClienteID and ( (StatusOrdemID = 1) OR (StatusOrdemID = 2) OR (StatusOrdemID = 3) OR (StatusOrdemID = 4) OR (StatusOrdemID = 6) OR (StatusOrdemID = 7) OR (StatusOrdemID = 8))) = 0
Carlos Eduardo Pieren - MCP- Sugerido como Resposta Carlos Eduardo Pieren terça-feira, 22 de setembro de 2009 18:02
-
-
-
-
Bom Dia,
De fato cometi um equívoco, pois, ao contrário do que pensava, o NOT pode sim retornar o resultado correto.
No caso dos clientes repetidos não é possível, pois, embora o DISTINCT pudesse filtrá-los, como você está exibindo um campo da tabela de pedidos, os clientes podem até repetir-se, mas essa coluna não irá repetir o que tornará as linhas diferentes mesmo que os clientes sejam os mesmos.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Outra alternativa para concatenar registros no SQL Server
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!727.entry
Classifique as respostas. O seu feedback é imprescindível -
-
Olá Dev_Leo,
A questão é que não se trata de clientes repetidos. Os clientes são repetidos, mas para cada repetição haverá um OrdemPedido.Resolvido diferente. Se pudéssemos eliminar as repetições o que faríamos com essa coluna da tabela OrdemPedido ? É por isso que o DISTINCT é ineficaz nesse caso. Se você não precisa dessa coluna, retire-a do SELECT juntamente com o JOIN. Isso eliminará as repetições.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Outra alternativa para concatenar registros no SQL Server
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!727.entry
Classifique as respostas. O seu feedback é imprescindível