none
SELECT DISTINCT com JOIN? RRS feed

  • Pergunta

  • Boa noite.

    Não consigo fazer um select, estou a dois dias tentando, pesquisando, testando...


    É o seguinte, ex.: 

    Tenho as tabelas, PEDIDOS, VENDEDORES e PRODUTOS.

    PRODUTOS ( id , nome )
    VENDEDORES ( id , nome )
    PEDIDOS ( data, idvendedor, idproduto )

    É um exemplo que simula bem o meu caso, sendo que a tabela PEDIDOS tem a PK em idvendedor e data (um vendedor não pode ter dois pedidos na mesma data e horário).

    Como eu seleciono o VENDEDOR e o PRODUTO que tenham o último pedido à partir de uma certa data?

    Passando a data 01/12/2008 13:00, preciso que retorne por exemplo:

    01/12/2008 12:00       João        Mouse
    01/12/2008 11:50       Pedro      Teclado
    01/12/2008 12:02       Maria       PC


    O último pedido de cada vendedor anterior à data X. Como fazer isso?

    Se alguém puder ajudar, tenho o código SQL simulando esse caso.



    Obrigado,

    André Ricardo



    === Editado por andrerm @ 03 dez 2008 9:10  UTC===
    Agora que postei que vi o fórum que está? Achei que estava postando em SQL Iniciantes. Como mudar?

    quarta-feira, 3 de dezembro de 2008 21:09

Respostas

  • Olá,

     

    Veja se este exemplo também ajuda, desenvolvido para o SQL Server 2005 utilizando CTE e também o 2000, sem o uso do CTE.

     

    Code Snippet

    Create Table Tabela

    (Id Int,

    IdProd Int,

    Custo Float,

    DataCompra DateTime)

    Insert Into Tabela Values(1,5,66.60, GETDATE())

    Insert Into Tabela Values(2,5,08.61, GETDATE()-2)

    Insert Into Tabela Values(3,5,14.62, GETDATE()-1)

    Insert Into Tabela Values(4,8,28.63, GETDATE()+1)

    Insert Into Tabela Values(5,8,32.64, GETDATE()+2)

    Insert Into Tabela Values(6,8,64.65, GETDATE()+3)

     

    Select * from Tabela;

    With SomaData(IdProd, Data)

    As (

    Select IdProd, MAX(DataCompra) from Tabela

    Group By IdProd

    )

    Select T.Id, S.IdProd, T.Custo, S.Data

    from Tabela T Inner Join SomaData S

    On T.DataCompra = S.Data

     

     

    --Sem CTE --

    Select T.Id, S.IdProd, T.Custo, S.Data

    from Tabela T Inner Join (Select IdProd, MAX(DataCompra) As Data from Tabela Group By IdProd) S

    On T.DataCompra = S.Data

     

     

    quinta-feira, 4 de dezembro de 2008 16:14
  • Boa tarde,

    Obrigado pelas respostas mas nenhum dos dois jeitos deu certo.
    Teria que ser algo como o Júnior Galvão postou, mas faltou um detalhe, porque podem ter duas vendas no mesmo horário de vendedores diferentes.

    Algo tipo:

    select

         pe.data,

         v.nome,

         p.nome

    from pedidos as pe
        
    inner join (select idvendedor, max(data) as data from pedidos group by idvendedor) as s
             
    on pe.data = s.data  AND PE.IDVENDEDOR = S.IDVENDEDOR
         join produtos ason p.idproduto = pe.idproduto
        
    join vendedores as v on v.idvendedor = pe.idvendedor



    Estava escrevendo a resposta, e resolvi testar on pe.data = s.data  AND PE.IDVENDEDOR = S.IDVENDEDOR. ....e não é que funciona??

    Não imaginava que podia usar o AND junto com o ON, deu certo!!!


    Muito obrigado.


    André Ricardo



    quinta-feira, 4 de dezembro de 2008 16:48

Todas as Respostas

  • Bom Dia,

     

    Tente o seguinte:

     

    Code Snippet

    SELECT MaiorData, V.Nome AS Vendedor, P.Nome AS Produto

    FROM

    Vendedores AS V

    INNER JOIN Pedidos AS Pe ON V.IDVendedor = Pe.IDVendedor

    INNER JOIN (

    SELECT IDVendedor, MAX(Data) As MaiorData FROM Pedidos GROUP BY IDVendedor) AS M

    ON Pe.IDVendedor = M.IDVendedor AND Pe.IDVendedor =M.IDVendedor

    LEFT OUTER JOIN Produtos AS P ON Pe.IDProduto = P.IDProduto

     

    [ ]s,

     

    Gustavo

    quinta-feira, 4 de dezembro de 2008 11:26
  • Olá,

     

    Veja se este exemplo também ajuda, desenvolvido para o SQL Server 2005 utilizando CTE e também o 2000, sem o uso do CTE.

     

    Code Snippet

    Create Table Tabela

    (Id Int,

    IdProd Int,

    Custo Float,

    DataCompra DateTime)

    Insert Into Tabela Values(1,5,66.60, GETDATE())

    Insert Into Tabela Values(2,5,08.61, GETDATE()-2)

    Insert Into Tabela Values(3,5,14.62, GETDATE()-1)

    Insert Into Tabela Values(4,8,28.63, GETDATE()+1)

    Insert Into Tabela Values(5,8,32.64, GETDATE()+2)

    Insert Into Tabela Values(6,8,64.65, GETDATE()+3)

     

    Select * from Tabela;

    With SomaData(IdProd, Data)

    As (

    Select IdProd, MAX(DataCompra) from Tabela

    Group By IdProd

    )

    Select T.Id, S.IdProd, T.Custo, S.Data

    from Tabela T Inner Join SomaData S

    On T.DataCompra = S.Data

     

     

    --Sem CTE --

    Select T.Id, S.IdProd, T.Custo, S.Data

    from Tabela T Inner Join (Select IdProd, MAX(DataCompra) As Data from Tabela Group By IdProd) S

    On T.DataCompra = S.Data

     

     

    quinta-feira, 4 de dezembro de 2008 16:14
  • Boa tarde,

    Obrigado pelas respostas mas nenhum dos dois jeitos deu certo.
    Teria que ser algo como o Júnior Galvão postou, mas faltou um detalhe, porque podem ter duas vendas no mesmo horário de vendedores diferentes.

    Algo tipo:

    select

         pe.data,

         v.nome,

         p.nome

    from pedidos as pe
        
    inner join (select idvendedor, max(data) as data from pedidos group by idvendedor) as s
             
    on pe.data = s.data  AND PE.IDVENDEDOR = S.IDVENDEDOR
         join produtos ason p.idproduto = pe.idproduto
        
    join vendedores as v on v.idvendedor = pe.idvendedor



    Estava escrevendo a resposta, e resolvi testar on pe.data = s.data  AND PE.IDVENDEDOR = S.IDVENDEDOR. ....e não é que funciona??

    Não imaginava que podia usar o AND junto com o ON, deu certo!!!


    Muito obrigado.


    André Ricardo



    quinta-feira, 4 de dezembro de 2008 16:48
  • André,

     

    Valeu, que bom que consegui ajudar!!!

     

     

    quinta-feira, 4 de dezembro de 2008 16:54