none
Select por status do Pedido RRS feed

  • 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
    terça-feira, 22 de setembro de 2009 03:31

Respostas

  • 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!!
    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 <> 5)
    Att. Leandro Hexsel Bugalho
    • Marcado como Resposta Leonardo Leite terça-feira, 22 de setembro de 2009 18:42
    terça-feira, 22 de setembro de 2009 17:04

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

    terça-feira, 22 de setembro de 2009 06:20
  •  Segue abaixo uma sugestão:
    select clientes.* from clientes,pedidos where 
    clientes.cod = pedidos.clienteId and clientes.cod not in (select clienteID from pedidos where statusPedido <> 1)

    Att. Leandro Hexsel Bugalho
    terça-feira, 22 de setembro de 2009 10:57
  • 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
    terça-feira, 22 de setembro de 2009 13:59
  • 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!!
    terça-feira, 22 de setembro de 2009 16:43
  • 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
    terça-feira, 22 de setembro de 2009 16:48
  • 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!!
    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 <> 5)
    Att. Leandro Hexsel Bugalho
    • Marcado como Resposta Leonardo Leite terça-feira, 22 de setembro de 2009 18:42
    terça-feira, 22 de setembro de 2009 17:04

  • 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
    terça-feira, 22 de setembro de 2009 18:01
  • Ficou Show de bola Valeu mesmo eu não sabia que tinha com fazer um subselect....Muito bom
    terça-feira, 22 de setembro de 2009 18:47
  • Dev,

    Na verdade um Sub-Select é conhecido e definido como SubQuery.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 22 de setembro de 2009 19:04
  • Mais um detalhe  !
    Alguem saberia dizer como tirar os clientes Repetido tipo Distinct?
    terça-feira, 22 de setembro de 2009 20:52
  • 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
    quarta-feira, 23 de setembro de 2009 10:52
  • Vc acha que existe uma forma de filtrar esses clientes Repetidos até chegar no reportviewer ou até mesmo nele ou com um Dataview?
    quarta-feira, 23 de setembro de 2009 14:50
  • 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
    quarta-feira, 23 de setembro de 2009 22:23